Решение на Първа задача от Мартина Радева

Обратно към всички решения

Към профила на Мартина Радева

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 12 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def series(row_type, index)
case row_type
when 'fibonacci' then row_element(1, 1, index)
when 'lucas' then row_element(2, 1, index)
when 'summed' then row_element(3, 2, index)
end
end
def row_element(first, second, index)
return first if index == 1
return second if index == 2
row_element(first, second, index - 1) + row_element(first, second, index - 2)
end

Лог от изпълнението

............

Finished in 0.02047 seconds
12 examples, 0 failures

История (3 версии и 6 коментара)

Мартина обнови решението на 10.10.2014 22:44 (преди около 10 години)

+# reviews and comments are more than welcome.
+# couldnt install aspell
+# feel free to comment on styling and limitations as well.
+
+def series(string, number)
+ if string == 'fibonacci'
+ recursive(1, 1, number)
+ elsif string == 'lucas'
+ recursive(2, 1, number)
+ else recursive(3, 2, number)
+ end
+end
+
+def recursive(first, second, number)
+ return first if number == 1
+ return second if number == 2
+ recursive(first, second, number-1) + recursive(first, second, number-2)
+end

Здравей!

Решението ти ми харесва. :)

Имам само няколко забележки, основно за стилови неща:

  • Промяната на началните стойности за сумата е интересна. Единственото нещо, което леко ме притеснява е, че не става веднага ясно, че задачата на recursive(3, 2, number) е да върне сумата на двата реда. Според мен тук имаш две възможности - да го направиш по друг начин, чрез събиране, или да напишеш кратък коментар на съответния ред от код, който да показва, че това е сумата на двата реда. Не се притеснявай за бързодействието на програмата, това няма да го гледаме. :)

  • Този else recursive(...) на един ред не е консистентен с останалите, които не са на един ред. Предполагам, че си го направила така заради ограничението от 5 реда в метод. Опитай се да го направиш по друг начин. Може да разгледаш конструкцията case ... when ... then ....

  • Имената на променливи и функции трябва да са описателни - това е доста важно. Например параметъра string казва единствено, че се очаква да се подаде string. Трябва да дава и информация за това какъв смисъл съдържа този string. В твоя случай е име на ред. Същото важи и за number (и на двете места).

  • Помощната ти функция се нарича recursive. Да, наистина е рекурсивна, но има неща, които я описват по-добре. Например това, че смята рекурсивни редове. first и second също могат да си подобрят имената. Можеш например да уточниш (чрез името), че са стойности (или числа).

  • Слагай по едно празно място около аритметичните оператори, така става по-четимо.

  • Можеш да сложиш и един празен ред след return-ите във втората функция, по-добре ще изглежда като са разделени крайните случаи от другия.

Питай ако се колебаеш за някое име или за нещо друго.

Мартина обнови решението на 13.10.2014 08:22 (преди около 10 години)

-# reviews and comments are more than welcome.
-# couldnt install aspell
-# feel free to comment on styling and limitations as well.
-
def series(string, number)
- if string == 'fibonacci'
- recursive(1, 1, number)
- elsif string == 'lucas'
- recursive(2, 1, number)
- else recursive(3, 2, number)
+ case string
+ when 'fibonacci' then recursive(1, 1, number)
+ when 'lucas' then recursive(2, 1, number)
+ when 'summed' then recursive(3, 2, number)
end
end
def recursive(first, second, number)
return first if number == 1
+
return second if number == 2
- recursive(first, second, number-1) + recursive(first, second, number-2)
-end
+
+ recursive(first, second, number - 1) + recursive(first, second, number - 2)
+end

Благодаря за съдържателния коментар. Преработих си решението.

  • За имената: Оригиналното име на втората функция беше recursive_row, но това прави 17ти ред(от предното решение, тук - 14ти) 81 символа дълъг (в съчетание с изискването имената на променливите да са валидни английски думи). Според мен n, i и прочее са напълно приемливи за имена на всякакви броячи и поредности, даже по-четими от произволна-английска-дума, но такова е поставеното ограничение на задачата. Засега си оставям recursive.

  • За else.. Оригиналният вид на функцията беше с Case, но три случая в него правеха шест реда. Не знаех за синтаксиса с then на 1 ред - благодаря, определено е по-добре.

Ако стане много дълъг реда с рекурсивните извиквания, винаги можеш да сложиш един нов ред след плюса. :)

За празния ред имах предвид след двата return-a като група, между тях може да няма. Но това е само моето виждане, ти си прецени как изглежда по-добре.

Иначе n и i имат своите приложения, но доста по-рядко, отколкото се използват. i като индекс в цикъл например в Ruby изобщо няма да ти се налага да използваш, защото просто не се обхождат неща с for цикли.

Мартина обнови решението на 13.10.2014 22:51 (преди около 10 години)

-def series(string, number)
- case string
- when 'fibonacci' then recursive(1, 1, number)
- when 'lucas' then recursive(2, 1, number)
- when 'summed' then recursive(3, 2, number)
+def series(row_type, index)
+ case row_type
+ when 'fibonacci' then row_element(1, 1, index)
+ when 'lucas' then row_element(2, 1, index)
+ when 'summed' then row_element(3, 2, index)
end
end
-def recursive(first, second, number)
- return first if number == 1
+def row_element(first, second, index)
+ return first if index == 1
+ return second if index == 2
- return second if number == 2
-
- recursive(first, second, number - 1) + recursive(first, second, number - 2)
+ row_element(first, second, index - 1) + row_element(first, second, index - 2)
end

На мен ми изглежда по-добре :) Само не съм сигурен дали row е правилен превод на ред в математическия смисъл.

Относно четимостта - задачата е прекалено малка, за да си проличи, пък и ние сме запознати с условието, тоест знаем какво да очакваме. Един истински тест за яснота би бил да дадем тези две функции на някой, без да му казваме условието и да видим за колко време ще разбере какво правят. Със сигурност първият източник на информация, който даденият човек ще погледне, са имената на методите и параметрите им. :)