Атанас обнови решението на 11.10.2014 13:18 (преди над 10 години)
+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 всъщност са имена на, а не типове редици. Това беше наша грешка в първоначалното условие, поправихме се.
Като цяло няма сериозни пропуски, ако адресираш горните точки ще стане доста добре. Хубаво е че си видял и алтернативния синтаксис за създаване на масиви. :)