Решение на Първа задача от Яни Малцев

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

Към профила на Яни Малцев

Резултати

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

Код

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

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

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

Finished in 0.02177 seconds
12 examples, 0 failures

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

Яни обнови решението на 10.10.2014 16:24 (преди около 10 години)

+def fibonacci(id)
+ id < 2 ? id : fibonacci(id-1) + fibonacci(id-2)
+end
+
+def lucas(id)
+ id < 3 ? (id-3).abs : lucas(id-1) + lucas(id-2)
+end
+
+def series(string, index)
+ string=='fibonacci' && fibonacci(index) ||
+ string=='lucas' && lucas(index) ||
+ string=='summed' && lucas(index) + fibonacci(index)
+end
  • Имаш леки проблеми с whitespaces, погледни style guide-а, за да ги адресираш.
  • string е много generic. Всеки string може да се казва string. Точно този string има някакво специално значение, опитай се то да бъде явно от името му. Също не съм сигурен доколко съкращението до id е уместно.
  • Решението ти ще стане по-четимо ако използваш if - elsif - else или просто case в series.
  • Добре е, че си забелязал зависимост като (id-3).abs, но не е сред най-очевидните и очаквани неща в кода. Старай се да имаш ясно и четимо решение, пред по-хитроумно или с по-малко на брой символи. Не е случайно, че сме ви дали до 5 реда на метод.
  • Леко си разширил дефиниционното множество на нашия fibonacci.

Благодаря за забележките.

Единствено неразбирам, какво означава, че съм разширил дефиниционното множество на fibonacci? Първите индекси отговарят точно, а за следващите не виждам някакво ограничение. Както и защо това не важи за lucas при условие, че им е еднаква както логиката така и условието? Ако става въпрос за нулевия елемент, който се достига от fibonacci(id-2) - нали това си е навалиден индекс по условие?

Според нашата дефиниция:

F(1) = 1 F(2) = 1 F(3) = 2 F(4) = 3 ...

За fibonacci(0) тя е недефинирана. Няма проблем да си връщаш или гърмиш както си искаш за тези стойности. Но изчислението ти на fibonacci(2) (и всеки член след това) разчита на факта, че fibonacci(0) == 0. По условие това не е факт, а случайно следствие от имплементацията ти. lucas в тази си форма няма този проблем (не разчита на недефинирана стойност).

Яни обнови решението на 10.10.2014 21:08 (преди около 10 години)

-def fibonacci(id)
- id < 2 ? id : fibonacci(id-1) + fibonacci(id-2)
+def fibonacci(index)
+ if index < 3
+ 1
+ else
+ fibonacci(index - 1) + fibonacci(index - 2)
+ end
end
-def lucas(id)
- id < 3 ? (id-3).abs : lucas(id-1) + lucas(id-2)
+def lucas(index)
+ if index < 3
+ index == 1 ? 2 : 1
+ else
+ lucas(index - 1) + lucas(index - 2)
+ end
end
-def series(string, index)
- string=='fibonacci' && fibonacci(index) ||
- string=='lucas' && lucas(index) ||
- string=='summed' && lucas(index) + fibonacci(index)
+def series(type, index)
+ case type
+ when 'fibonacci' then fibonacci(index)
+ when 'lucas' then lucas(index)
+ when 'summed' then lucas(index) + fibonacci(index)
+ end
end