Решение на Първа задача от Ивайло Георгиев

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

Към профила на Ивайло Георгиев

Резултати

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

Код

def get_element(first, second, index)
return first if index <= 1
return second if index == 2
get_element(first, second, index - 1) + get_element(first, second, index - 2)
end
def series(name, index)
return get_element(1, 1, index) if name == 'fibonacci'
return get_element(2, 1, index) if name == 'lucas'
get_element(1, 1, index) + get_element(2, 1, index)
end

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

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

Finished in 0.02376 seconds
12 examples, 0 failures

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

Ивайло обнови решението на 10.10.2014 17:18 (преди около 10 години)

+def fibonacci(number)
+ number <= 1 ? number : fibonacci(number - 1) + fibonacci(number - 2)
+end
+
+def lucas(number)
+ return 2 if number == 1
+ return 1 if number == 2
+ lucas(number - 1) + lucas(number - 2)
+end
+
+def series(string, number)
+ return fibonacci(number) if string == 'fibonacci'
+ return lucas(number) if string == 'lucas'
+ fibonacci(number) + lucas(number)
+end

Здравей :)

Решението ти е доста хубаво, имам само някои коментари:

  • Във fibonacci вместо тернарния оператор ?:, ще е по-лесно четимо, ако го направиш както в lucas с return ... if ....
  • Аз бих сложил празни редове след последния return, така че условията за дъното на рекурсията да бъдат визуално отделени от резултата в другия случай.
  • string и number са доста общи имена на променливи, можеш ли да измислиш нещо по-добро? Задай си въпроса "Какво съдържат тези параметри?" и го използвай за имената им.

fibonacci и lucas са доста сходни като код, може ли да помислиш за начин да премахнеш това повторение?

Ивайло обнови решението на 12.10.2014 13:34 (преди около 10 години)

-def fibonacci(number)
- number <= 1 ? number : fibonacci(number - 1) + fibonacci(number - 2)
-end
+def fibonacci(index)
+ return index if index <= 1
-def lucas(number)
- return 2 if number == 1
- return 1 if number == 2
- lucas(number - 1) + lucas(number - 2)
+ fibonacci(index - 1) + fibonacci(index - 2)
end
-def series(string, number)
- return fibonacci(number) if string == 'fibonacci'
- return lucas(number) if string == 'lucas'
- fibonacci(number) + lucas(number)
+def lucas(index)
+ return 2 if index <= 1
+
+ fibonacci(index - 2) + fibonacci(index)
end
+
+def series(name, index)
+ return fibonacci(index) if name == 'fibonacci'
+ return lucas(index) if name == 'lucas'
+
+ fibonacci(index) + lucas(index)
+end

Малко ми е странно нещо. Защо lucas използва fibonacci? Хубаво е, че си намерил някаква закономерност, но не ми се струва много ясно какво се случва. В случая според мен е по-добре просто да си оставиш рекурсията да си използва lucas. Напълно нормално е да имаш две условия от типа return ... if нещо.

За повторението имах предвид, че и двете функции ползват функцията(index - 1) + функцията(index - 2). Идеята ми беше да се опиташ да ги направиш на една функция, която може да върши работата и на двете (с някакви допълнителни параметри например).

Ивайло обнови решението на 13.10.2014 14:09 (преди около 10 години)

-def fibonacci(index)
- return index if index <= 1
+def get_element(first, second, index)
+ return first if index <= 1
+ return second if index == 2
- fibonacci(index - 1) + fibonacci(index - 2)
+ get_element(first, second, index - 1) + get_element(first, second, index - 2)
end
-def lucas(index)
- return 2 if index <= 1
-
- fibonacci(index - 2) + fibonacci(index)
-end
-
def series(name, index)
- return fibonacci(index) if name == 'fibonacci'
- return lucas(index) if name == 'lucas'
+ return get_element(1, 1, index) if name == 'fibonacci'
+ return get_element(2, 1, index) if name == 'lucas'
- fibonacci(index) + lucas(index)
+ get_element(1, 1, index) + get_element(2, 1, index)
end