Диана обнови решението на 09.10.2014 22:27 (преди около 10 години)
Хитро решение, с математика :)
Няколко забележки:
Има проблеми с whitespace при дефинициите на функциите, за справка style guide-a.
Разгледай
case
констукцията в руби.
............ Finished in 0.01332 seconds 12 examples, 0 failures
Хитро решение, с математика :)
Няколко забележки:
Има проблеми с whitespace при дефинициите на функциите, за справка style guide-a.
Разгледай case
констукцията в руби.
Не можах да сложа case-a в 6 реда, скептикът не ми го харесва:
def series(name, n)
case name
when "fibonacci"
return fibonacci(n)
when "lucas"
return lucas(n)
end
lucas(n) + fibonacci(n)
end
Тъй като бранчовете в case
-a са доста прости, можеш да ползваш синтаксиса с when .. then ..
.
Tук има един такъв пример (които не е индентиран добре).
Taка има красива дъга. :D
С дъга изглежда по-добре от преди. ( :
Вече можеш да махнеш и тези return
-и от бранчовете, тъй като и трите 'сценария' са в case
и той отговаря за целия control flow (за разлика от предишното решение, където ако няма return
-и винаги се връща сумираната редица).
Изморих се да трия, това ще е. Мерси за отделеното време :)
Имам въпрос. По-добре ли е, ако е в този вид? Как да го оставя? И изобщо по-четимо ли е? :D (тези въпроси възникнаха в 100 с Николай Генов и не знам дали да редактирам самия код)
def formula(n, first, second)
if(n == 1)
return first
elsif (n == 2)
return second
end
return (formula(n - 1, first, second) + formula(n - 2, first, second))
end
def series(name, n)
case name
when "fibonacci" then formula(n, 1, 1)
when "lucas" then formula(n, 2, 1)
when "summed" then (formula(n, 1, 1) + formula(n, 2, 1))
end
end
Двете решения са абсолютно различни. И двете са добре.
При второто във функцията formula
ще е по-добре, ако случая със сумата го вкараш в if
-a като else
условие, или можеш отново да ползваш case
. Така ще се оттървеш от тези return
-и.
От към четимост отново са добре и двете, просто първото използва някаква математическа магия. Лично на мен от тези две решения ми харесва повече първото. Когато имаш някаква доказана и бърза формула е логично да си я ползваш. Второто решение си е класическото решение с рекурсия, ок е, само дето е много бавно.
Остави задачата както искаш :).
P.S
Все още имаш проблеми с whitespace на първи и четвърти ред от първото решение.
Да, съжалявам. Просто ми беше интересно дали е въпрос на вкус (или стил) Мерси.
Гошо, подвел си я. case
се индентира така според ръководството за стил:
case year
when 1850..1889 then 'Blues'
when 1890..1909 then 'Ragtime'
when 1910..1929 then 'New Orleans Jazz'
when 1930..1939 then 'Swing'
when 1940..1950 then 'Bebop'
else 'Jazz'
end
Ето и референция от Style Guide-a.
Edit: Оппа. Аз я подвеждам. Извинения В нашия Style Guide било друго.
Аз бих сложил интервали около оператора **
.
Как ти дойде наум да направиш това решение?
Поизпуснах срока. До колкото помня, според стайл гайда няма там, но щ. погледна пак. Относно решението: първия семестър имахме дискретни структури при Минко Марков и специален час за рекурсиите (чак се падна и на изпита) и един от примерите, разбира се, беше Фибоначи. Естествено, може да се приложи и за Лукас...и реших, че ще е похабена година, ако поне не приложа знанията си от нея.
Диана, права си, че според гайда няма интервали там. Взимам си думите назад за интервалите.
За другото ще ти дадем бонус точки :)