Решение на Първа задача от Теодор Драганов

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

Към профила на Теодор Драганов

Резултати

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

Код

def fibonacci(index)
case index
when 1 then 1
when 2 then 1
else fibonacci(index - 1) + fibonacci(index - 2)
end
end
def lucas(index)
case index
when 1 then 2
when 2 then 1
else lucas(index - 1) + lucas(index - 2)
end
end
def series(sequence_type, index)
case sequence_type
when "fibonacci" then fibonacci(index)
when "lucas" then lucas(index)
when "summed" then fibonacci(index) + lucas(index)
end
end

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

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

Finished in 0.02409 seconds
12 examples, 0 failures

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

Теодор обнови решението на 09.10.2014 02:10 (преди около 10 години)

+@@fibonacci_sequence = [1, 1]
+@@lucas_sequence = [2, 1]
+
+def fibonacci(index)
+ while index > @@fibonacci_sequence.count do
+ next_element = @@fibonacci_sequence[-1] + @@fibonacci_sequence[-2]
+ @@fibonacci_sequence.insert(-1, next_element)
+ end
+
+ @@fibonacci_sequence[index-1]
+end
+
+def lucas(index)
+ while index > @@lucas_sequence.count do
+ next_element = @@lucas_sequence[-1] + @@lucas_sequence[-2]
+ @@lucas_sequence.insert(-1, next_element)
+ end
+
+ @@lucas_sequence[index-1]
+end
+
+def series(sequence_type, index)
+ case sequence_type
+ when "fibonacci" then fibonacci(index)
+ when "lucas" then lucas(index)
+ when "summed" then fibonacci(index) + lucas(index)
+ end
+end
+
  • Ако си опитал да пуснеш програмата вероятно си видял нещо като warning: class variable access from toplevel. Ние не настояваме за възможно най-оптималното решение.
  • Решението ти е доста процедурно, избягвай да използваш while, освен когато очевидно няма по-добър начин.
  • Разгледай документацията на Array, за да видиш дали няма по-четими алтернативи на @@fibonacci_sequence.insert(-1, next_element) и @@fibonacci_sequence[index-1].

Теодор обнови решението на 09.10.2014 13:01 (преди около 10 години)

-@@fibonacci_sequence = [1, 1]
-@@lucas_sequence = [2, 1]
+#@@fibonacci_sequence = [1, 1]
+#@@lucas_sequence = [2, 1]
+#def fibonacci(index)
+ #while index > @@fibonacci_sequence.count do
+ #next_element = @@fibonacci_sequence[-1] + @@fibonacci_sequence[-2]
+ #@@fibonacci_sequence.push next_element
+ #end
+
+ #@@fibonacci_sequence.take(index).last
+#end
+
+#def lucas(index)
+ #while index > @@lucas_sequence.count do
+ #next_element = @@lucas_sequence[-1] + @@lucas_sequence[-2]
+ #@@lucas_sequence.push next_element
+ #end
+
+ #@@lucas_sequence.take(index).last
+#end
+
def fibonacci(index)
- while index > @@fibonacci_sequence.count do
- next_element = @@fibonacci_sequence[-1] + @@fibonacci_sequence[-2]
- @@fibonacci_sequence.insert(-1, next_element)
+ case index
+ when 1 then 1
+ when 2 then 1
+ else fibonacci(index-1) + fibonacci(index-2)
end
-
- @@fibonacci_sequence[index-1]
end
def lucas(index)
- while index > @@lucas_sequence.count do
- next_element = @@lucas_sequence[-1] + @@lucas_sequence[-2]
- @@lucas_sequence.insert(-1, next_element)
+ case index
+ when 1 then 2
+ when 2 then 1
+ else lucas(index-1) + lucas(index-2)
end
-
- @@lucas_sequence[index-1]
end
def series(sequence_type, index)
case sequence_type
when "fibonacci" then fibonacci(index)
when "lucas" then lucas(index)
when "summed" then fibonacci(index) + lucas(index)
end
end
-

Това е по-функционална версия на решението. Старият код е закоментиран, тъй като има промени по него и искам да знам дали това е което се очакваше за по-четим код. Също и идеята на предното решение беше да се избегне повторното изчисляването на един и същи елемент от дадена редица.Има ли удобен начин да се направи това, без да се налага да го слагаме в клас(и без warning съответно :).

Благодаря предварително

Да, тази версия на решението ти ми харесва много повече. Ако оправиш дребни проблеми с whitespaces направо ще е супер. Някои биха казали, че може да DRY-неш изчислението на fibonacci и lucas, но според мен така е по-четимо и обвързването на двете имплементации не ми звучи като невероятна идея.

Като студент във ФМИ напълно разбирам желанието за оптимизация. Поне за мен отговорът на въпроса ти ми е малко труден. Трябва да имаш предвид, че почти винаги кодът е в някакъв клас/модул. Изключение има когато правиш малки скриптчета или решаваш някоя от първите задачи в курса по Ruby :) Ще се опитам да отговоря: със сигурност начинът не е с @@. Ако сложиш масива в константа ще можеш да добавяш нови елементи без да получаваш warning-и, защото не променяш към какво сочи самата константа, но отново идеологически това е много голямо зло. Може би си в един от много малкото валидни use case-и за глобални променливи, но сме ви забранили да ги ползвате :)

Теодор обнови решението на 09.10.2014 16:58 (преди около 10 години)

-#@@fibonacci_sequence = [1, 1]
-#@@lucas_sequence = [2, 1]
-
-#def fibonacci(index)
- #while index > @@fibonacci_sequence.count do
- #next_element = @@fibonacci_sequence[-1] + @@fibonacci_sequence[-2]
- #@@fibonacci_sequence.push next_element
- #end
-
- #@@fibonacci_sequence.take(index).last
-#end
-
-#def lucas(index)
- #while index > @@lucas_sequence.count do
- #next_element = @@lucas_sequence[-1] + @@lucas_sequence[-2]
- #@@lucas_sequence.push next_element
- #end
-
- #@@lucas_sequence.take(index).last
-#end
-
def fibonacci(index)
case index
- when 1 then 1
- when 2 then 1
- else fibonacci(index-1) + fibonacci(index-2)
+ when 1 then 1
+ when 2 then 1
+ else fibonacci(index-1) + fibonacci(index-2)
end
end
def lucas(index)
case index
- when 1 then 2
- when 2 then 1
- else lucas(index-1) + lucas(index-2)
+ when 1 then 2
+ when 2 then 1
+ else lucas(index-1) + lucas(index-2)
end
end
def series(sequence_type, index)
case sequence_type
- when "fibonacci" then fibonacci(index)
- when "lucas" then lucas(index)
- when "summed" then fibonacci(index) + lucas(index)
+ when "fibonacci" then fibonacci(index)
+ when "lucas" then lucas(index)
+ when "summed" then fibonacci(index) + lucas(index)
end
end

Благодаря за подробния отговор.Разбирам какво имаш предвид. Мисля, че успях да адресирам правилно пропуснатите празни места по новото решение. Само не разбрах поправките по старото решение дали са адекватни? Относно @@fibonacci_sequence.insert(-1, next_element) и @@fibonacci_sequence[index-1]...?

  • Все още имаш много лек проблем с whitespace.
  • Относно забележките по първоначалното решение - Ruby се старае да дефинира говорими методи за всички често използвани операции. Силно ти препоръчвам да хвърлиш един поглед на документацията на Enumerable и Array, много вероятно ще намериш метод за много известна операция със стек и ежедневни неща като вземане на последния елемент на масив.

Теодор обнови решението на 10.10.2014 00:44 (преди около 10 години)

def fibonacci(index)
case index
when 1 then 1
when 2 then 1
- else fibonacci(index-1) + fibonacci(index-2)
+ else fibonacci(index - 1) + fibonacci(index - 2)
end
end
def lucas(index)
case index
when 1 then 2
when 2 then 1
- else lucas(index-1) + lucas(index-2)
+ else lucas(index - 1) + lucas(index - 2)
end
end
def series(sequence_type, index)
case sequence_type
when "fibonacci" then fibonacci(index)
when "lucas" then lucas(index)
when "summed" then fibonacci(index) + lucas(index)
end
end

Когато говорех за старото ти решение реферирах точно push, << и last.

На мен лично, последната ти версия ми харесва. Само нещо дребно - fibonacci и lucas са имена на, а не типове редици. Това беше наша грешка в първоначалното условие, поправихме се.