Решение на Първа задача от Атанас Димитров

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

Към профила на Атанас Димитров

Резултати

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

Код

def series(series_name, number)
if series_name == 'fibonacci' then find_series_element(1, 1, number)
elsif series_name == 'lucas' then find_series_element(2, 1, number)
else
find_series_element(1, 1, number) + find_series_element(2, 1, number)
end
end
def find_series_element(first, second, number)
if number == 1 then first
elsif number == 2 then second
else
find_series_element(second, first + second, number - 1)
end
end

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

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

Finished in 0.00934 seconds
12 examples, 0 failures

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

Атанас обнови решението на 11.10.2014 13:18 (преди над 9 години)

+def series(type_series, number)
+ unless %w(fibonacci lucas).include? type_series
+ return formula(2, 1, number) + formula(1, 1, number)
+ end
+ type_series == 'lucas' ? formula(2, 1, number) : formula(1, 1, number)
+end
+
+
+def formula(base_one, base_two, number)
+ if number == 1 or number == 2
+ return [base_one, base_two][number - 1]
+ end
+ formula(base_two, base_one + base_two, number - 1)
+end
  • Трябва да поработиш малко над измислянето на имена. Какво точно трябва да са база едно и база две? Допускам, че може да има терминология, с която не съм запознат, но в момента като ги чета не ми говорят много. formula е донякъде generic. Всяка формула може да се казва formula. Въпросът е за какво точно е тази формула. Също don't quote me, но мисля, че рекурентните зависимости не се квалифицират като формули.
  • Вероятно ако използваш if - elsif - else или case (switch-ът в Ruby) двата метода ще станат по-четими.
  • По принцип оставяй празен ред между връщането при 'изключителни' стойности и останалата логика или изчисленията и финалния резултатен израз.
  • Предпочитай ясни решения пред по-хитри или кратки такива. Знам, че ти изглежда тривиално, но не е моментално очевидно как работи [base_one, base_two][number - 1].
  • fibonacci и lucas всъщност са имена на, а не типове редици. Това беше наша грешка в първоначалното условие, поправихме се.

Като цяло няма сериозни пропуски, ако адресираш горните точки ще стане доста добре. Хубаво е че си видял и алтернативния синтаксис за създаване на масиви. :)

Атанас обнови решението на 13.10.2014 00:02 (преди над 9 години)

-def series(type_series, number)
- unless %w(fibonacci lucas).include? type_series
- return formula(2, 1, number) + formula(1, 1, number)
+def series(series_name, number)
+ if series_name == 'fibonacci' then find_series_element(1, 1, number)
+ elsif series_name == 'lucas' then find_series_element(2, 1, number)
+ else
+ find_series_element(1, 1, number) + find_series_element(2, 1, number)
end
- type_series == 'lucas' ? formula(2, 1, number) : formula(1, 1, number)
end
-def formula(base_one, base_two, number)
- if number == 1 or number == 2
- return [base_one, base_two][number - 1]
+def find_series_element(first, second, number)
+ if number == 1 then first
+ elsif number == 2 then second
+ else
+ find_series_element(second, first + second, number - 1)
end
- formula(base_two, base_one + base_two, number - 1)
end