Георги обнови решението на 09.10.2014 13:59 (преди около 10 години)
+def fibonacci(index)
+ if index == 1 or index == 2
+ 1
+ else
+ fibonacci(index - 1) + fibonacci(index - 2)
+ end
+end
+
+def lucas(index)
+ if index == 1
+ 2
+ elsif index == 2
+ 1
+ else
+ lucas(index - 1) + lucas(index - 2)
+ end
+end
+
+def summed(index)
+ lucas(index) + fibonacci(index)
+end
+
+def series(string, index)
+ choice = {
+ 'fibonacci' => fibonacci(index),
+ 'summed' => summed(index),
+ 'lucas' => lucas(index),
+ }
+ choice[string]
+end
- string е прекалено generic име. Всеки string може да се казва всеки string. В точно този случай, точно този string има някакво специално значение. Опитай се да направиш семантиката очевидна чрез името. Същото важи и за choice.
- Имаш малък проблем с индентацията, погледни style guide-а.
- Използването на hash по този начин носи проблем, който и аз не бях забелязал първоначално - трябва да се конструира целия при всяко извикване на
series
. С други думи всеки път ще смяташ и 3те редици, независимо коя ти трябва. По принцип не държим на изключително ефективни решения, но това е доста сериозен number crunching след като изчисленията са двойно или четворно разклонена рекурсися. Използвай обикновенif
-elsif
-else
илиcase
. - Не задължително лошо нещо, но поне лично ми изглежда не толкова естетически издържано да има 3-4 почти празни в началото на методите. Помисли за някаква алтернатива.