Решение на Първа задача от Елена Орешарова

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

Към профила на Елена Орешарова

Резултати

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

Код

def series(type, n)
case type
when "fibonacci" then fibonacci(n)
when "lucas" then lucas(n)
when "summed" then summed(n)
end
end
def fibonacci(n)
n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2)
end
def lucas(n)
case n
when 0 then -1
when 1 then 2
when 2 then 1
else lucas(n - 1) + lucas(n - 2)
end
end
def summed(n)
fibonacci(n) + lucas(n)
end

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

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

Finished in 0.02559 seconds
12 examples, 0 failures

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

Елена обнови решението на 14.10.2014 00:47 (преди около 10 години)

+def series(type, n)
+ if type == "summed"
+ summed(n)
+ else
+ type == "fibonacci" ? fibonacci_sum(n) : lucas_sum(n)
+ end
+end
+
+def fibonacci_sum(n)
+ n <= 1 ? n : fibonacci_sum(n - 1) + fibonacci_sum(n - 2)
+end
+
+def lucas_sum(n)
+ return lucas_sum(n - 1) + lucas_sum(n - 2) if n > 2
+ n == 0 ? 0 : n == 1? 2 : 1
+end
+
+def summed(n)
+ fibonacci_sum(n) + lucas_sum(n)
+end

Здрасти :smiley:

  • Разгледай case statement в руби, виж също как се индентира правилно тук. Може да ти бъде полезен за series.
  • Не е хубаво да се влагат тернарни оператори, става нечетимо. Помисли как да ги пренапишеш с if-else или с case. Ще стане малко по-дълго, но и по-разбираемо.
  • Защо нямаш summed_sum :grin:? Защото не е добро име, както не са добри и fibonacci_sum и lucas_sum. Можеш просто да махнеш този постфикс _sum, защото е подвеждащ (ако сумираше всички елементи от редицата до n-тия, тогава щеше да е ок).

Елена обнови решението на 14.10.2014 22:00 (преди около 10 години)

def series(type, n)
- if type == "summed"
- summed(n)
- else
- type == "fibonacci" ? fibonacci_sum(n) : lucas_sum(n)
+ case type
+ when "fibonacci" then fibonacci(n)
+ when "lucas" then lucas(n)
+ when "summed" then summed(n)
end
end
-def fibonacci_sum(n)
- n <= 1 ? n : fibonacci_sum(n - 1) + fibonacci_sum(n - 2)
+def fibonacci(n)
+ n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2)
end
-def lucas_sum(n)
- return lucas_sum(n - 1) + lucas_sum(n - 2) if n > 2
- n == 0 ? 0 : n == 1? 2 : 1
+def lucas(n)
+ case
+ when n > 2 then lucas(n - 1) + lucas(n - 2)
+ when n == 0 then 0
+ else n == 1 ? 2 : 1
+ end
end
def summed(n)
- fibonacci_sum(n) + lucas_sum(n)
+ fibonacci(n) + lucas(n)
end

series вече изглежда доста по-добре, няма я тази логика с вложени бранчове. Всички бранчове са на едно ниво и e доста декларативно, това е хубаво. :smile:

При lucas има още какво да се желае.

  • Ще тестваме само с положителни n, тъй че проверката n == 0 е излишна, освен това нулевото число на Лукас е -1.
  • Направи case като в series (switch-вай по n, както switch-ваш по type). Ако не знаеш как да направиш проверката n > 2 просто я остави за else клаузата.
  • elsе n == 1 ? 2 : 1 не е добре. Направи го като два отделни when-a.

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

def series(type, n)
- case type
+ case type
when "fibonacci" then fibonacci(n)
when "lucas" then lucas(n)
when "summed" then summed(n)
end
end
def fibonacci(n)
n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2)
end
def lucas(n)
- case
- when n > 2 then lucas(n - 1) + lucas(n - 2)
- when n == 0 then 0
- else n == 1 ? 2 : 1
+ case n
+ when 0 then -1
+ when 1 then 2
+ when 2 then 1
+ else lucas(n - 1) + lucas(n - 2)
end
end
def summed(n)
fibonacci(n) + lucas(n)
end
  • Можеш да форматираш then-овете един под друг, изглежда по-добре :)

    when 'beautiful' then ...
    when 'ugly'      then ...
    
  • summed е доста кратка функция, нямаш нужда от нея, направо й сложи съдържанието в series.
  • Можеш да махнеш when 0 then -1 от lucas, няма да проверяваме за него.

Иначе се е получило много добре. :)