Решение на Първа задача от Георги Костов

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

Към профила на Георги Костов

Резултати

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

Код

def fibonacci(index)
(index == 1 or index == 2) ? 1 : fibonacci(index - 1) + fibonacci(index - 2)
end
def lucas(index)
case index
when 1 then 2
when 2 then 1
else lucas(index - 1) + lucas(index - 2)
end
end
def summed(index)
lucas(index) + fibonacci(index)
end
def series(sequence, index)
case sequence
when 'fibonacci' then fibonacci(index)
when 'lucas' then lucas(index)
when 'summed' then summed(index)
end
end

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

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

Finished in 0.02313 seconds
12 examples, 0 failures

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

Георги обнови решението на 09.10.2014 13:59 (преди над 9 години)

+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 почти празни в началото на методите. Помисли за някаква алтернатива.

Георги обнови решението на 10.10.2014 01:02 (преди над 9 години)

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)
+ case index
+ when 1 then 2
+ when 2 then 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]
+def series(sequence, index)
+ case sequence
+ when 'fibonacci' then fibonacci(index)
+ when 'summed' then summed(index)
+ when 'lucas' then lucas(index)
+ end
end

Георги обнови решението на 10.10.2014 01:30 (преди над 9 години)

def fibonacci(index)
- if index == 1 or index == 2
- 1
- else
- fibonacci(index - 1) + fibonacci(index - 2)
- end
+ (index == 1 or index == 2) ? 1 : fibonacci(index - 1) + fibonacci(index - 2)
end
def lucas(index)
case index
when 1 then 2
when 2 then 1
else lucas(index - 1) + lucas(index - 2)
end
end
def summed(index)
lucas(index) + fibonacci(index)
end
def series(sequence, index)
case sequence
when 'fibonacci' then fibonacci(index)
- when 'summed' then summed(index)
when 'lucas' then lucas(index)
+ when 'summed' then summed(index)
end
end