Решение на Първа задача от Евгений Бояджиев

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

Към профила на Евгений Бояджиев

Резултати

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

Код

def series(series_type, element_index)
case series_type
when 'fibonacci' then fibonacci(element_index)
when 'lucas' then lucas(element_index)
when 'summed' then summed(element_index)
end
end
def fibonacci(element_index)
if element_index > 2
fibonacci(element_index - 1) + fibonacci(element_index - 2)
else 1
end
end
def lucas(element_index)
if element_index > 2
lucas(element_index - 1) + lucas(element_index - 2)
elsif element_index == 2 then 1
else 2
end
end
def summed(element_index)
fibonacci(element_index) + lucas(element_index)
end

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

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

Finished in 0.02159 seconds
12 examples, 0 failures

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

Евгений обнови решението на 13.10.2014 01:09 (преди около 10 години)

+def series(series_type, element_index)
+ if series_type eq 'fibonacci' then return fibonacci(element_index)
+ elsif series_type eq 'lucas' then return lucas(element_index)
+ elsif series_type eq 'summed' then return summed(element_index)
+ end
+end
+
+def fibonacci(element_index)
+ if element_index <= 1 then return 1
+ elsif element_index > 1
+ return fibonacci(element_index - 1) + fibonacci(element_index - 2)
+ end
+end
+
+def lucas(element_index)
+ if element_index <= 1 then return 1
+ elsif element_index eq 2 then return 2
+ elsif element_index > 1
+ return lucas(element_index - 1) + lucas(element_index - 2)
+ end
+end
+
+def summed(element_index)
+ return fibonacci(element_index) + lucas(element_index)
+end

Евгений обнови решението на 13.10.2014 01:31 (преди около 10 години)

def series(series_type, element_index)
- if series_type eq 'fibonacci' then return fibonacci(element_index)
- elsif series_type eq 'lucas' then return lucas(element_index)
- elsif series_type eq 'summed' then return summed(element_index)
+ if series_type == 'fibonacci' then return fibonacci(element_index)
+ elsif series_type == 'lucas' then return lucas(element_index)
+ elsif series_type == 'summed' then return summed(element_index)
end
end
def fibonacci(element_index)
- if element_index <= 1 then return 1
+ if element_index < 1 then return 0
+ elsif element_index == 1 then return 1
elsif element_index > 1
return fibonacci(element_index - 1) + fibonacci(element_index - 2)
end
end
def lucas(element_index)
- if element_index <= 1 then return 1
- elsif element_index eq 2 then return 2
- elsif element_index > 1
+ if element_index < 1 then return 0
+ elsif element_index == 1 then return 2
+ elsif element_index == 2 then return 1
+ elsif element_index > 2
return lucas(element_index - 1) + lucas(element_index - 2)
end
end
def summed(element_index)
return fibonacci(element_index) + lucas(element_index)
end

Евгений обнови решението на 13.10.2014 01:37 (преди около 10 години)

def series(series_type, element_index)
if series_type == 'fibonacci' then return fibonacci(element_index)
elsif series_type == 'lucas' then return lucas(element_index)
elsif series_type == 'summed' then return summed(element_index)
end
end
def fibonacci(element_index)
- if element_index < 1 then return 0
- elsif element_index == 1 then return 1
+ if element_index == 1 or element_index == 2 then return 1
elsif element_index > 1
return fibonacci(element_index - 1) + fibonacci(element_index - 2)
end
end
def lucas(element_index)
- if element_index < 1 then return 0
- elsif element_index == 1 then return 2
+ if element_index == 1 then return 2
elsif element_index == 2 then return 1
elsif element_index > 2
return lucas(element_index - 1) + lucas(element_index - 2)
end
end
def summed(element_index)
return fibonacci(element_index) + lucas(element_index)
end

Здравей (:

Един бърз feedback

Много приятно решение! Погледнал си Style Guide-a, което е похвално. Има само една дреболия, която е добре да оправиш и няколко насоки към още по-готино решение.

Забележки

  • Няма нужда да ползваш return (лош стил е), ако изразът е последният оценен. Например return-а в summed (и не само там) е напълно излишен.

Насоки

(помисли как може да ги ползваш, за да направиш решението си по елегантно)

  • Пробвай в series да ползваш case (switch-ът в Ruby), понеже проверяваш спрямо само една променлива.

  • Следното е валиден Ruby код (не е важно за примера, но приеми, че eat_spaghetti и hungry? са дефинирани). Обърни внимание на if конструкцията:

    eat_spaghetti if hungry?
    

Че това ще работи ли? И по-добре ли ще се чете?

def fibonacci(element_index) if element_index == 1 or element_index == 2 then 1 elsif element_index > 1 fibonacci(element_index - 1) + fibonacci(element_index - 2) end end

Разбирам, че в случая element_index ще се оцени като 1 (и това вероятно ще е последната оценка) и може би дори ще го върне, все едно има return, но не е ли по-добре да се застраховаме и да сложим return в случай, че после решим да добавим някой ред след if-а?

Месри за забележките.

Евгений обнови решението на 15.10.2014 08:45 (преди около 10 години)

def series(series_type, element_index)
- if series_type == 'fibonacci' then return fibonacci(element_index)
- elsif series_type == 'lucas' then return lucas(element_index)
- elsif series_type == 'summed' then return summed(element_index)
+ case series_type
+ when 'fibonacci' then fibonacci(element_index)
+ when 'lucas' then lucas(element_index)
+ when 'summed' then summed(element_index)
end
end
def fibonacci(element_index)
- if element_index == 1 or element_index == 2 then return 1
- elsif element_index > 1
- return fibonacci(element_index - 1) + fibonacci(element_index - 2)
+ if element_index > 2
+ fibonacci(element_index - 1) + fibonacci(element_index - 2)
+ else 1
end
end
def lucas(element_index)
- if element_index == 1 then return 2
- elsif element_index == 2 then return 1
- elsif element_index > 2
- return lucas(element_index - 1) + lucas(element_index - 2)
+ if element_index > 2
+ lucas(element_index - 1) + lucas(element_index - 2)
+ elsif element_index == 2 then 1
+ else 2
end
end
def summed(element_index)
- return fibonacci(element_index) + lucas(element_index)
+ fibonacci(element_index) + lucas(element_index)
end

Не намерих хубаво място за ползване на if modifier-а. Така че можеш ли да подскажеш къде точно би било удачно да се ползва?

Например може да се ползва така: return fibonacci(element_index - 1) + fibonacci(element_index - 2) if element_index > 2 return 1 if element_index <= 2

Но така губим else-а и следователно можем да пропуснем равното в "element_index <= 2" и да си счупим кода.