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

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

Към профила на Диана Генева

Резултати

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

Код

# http://mathforum.org/library/drmath/view/51448.html
PHI = (1 + Math.sqrt(5)) / 2
def fibonacci(n)
((PHI**n - (-PHI)**(-n)) / Math.sqrt(5)).round
end
def lucas(n)
(PHI**(n - 1) + (1 - PHI)**(n - 1)).round
end
def series(name, n)
case name
when "fibonacci" then fibonacci(n)
when "lucas" then lucas(n)
when "summed" then lucas(n) + fibonacci(n)
end
end

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

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

Finished in 0.01332 seconds
12 examples, 0 failures

История (6 версии и 13 коментара)

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

+FI = (1 + Math.sqrt(5))/2
+
+def fibonacci( n )
+ ((FI**n - (- FI)**(-n))/ Math.sqrt(5)).round
+end
+
+def lucas( n )
+ (FI**(n - 1) + (1 - FI)**(n - 1)).round
+end
+
+def series ( name, n)
+ if name == "fibonacci"
+ return fibonacci(n)
+ end
+ if name == "lucas"
+ return lucas(n)
+ end
+ lucas(n) + fibonacci(n)
+end

Диана обнови решението на 10.10.2014 11:23 (преди около 10 години)

FI = (1 + Math.sqrt(5))/2
-def fibonacci( n )
+def fibonacci(n)
((FI**n - (- FI)**(-n))/ Math.sqrt(5)).round
end
-def lucas( n )
+def lucas(n)
(FI**(n - 1) + (1 - FI)**(n - 1)).round
end
-def series ( name, n)
+def series(name, n)
if name == "fibonacci"
return fibonacci(n)
- end
- if name == "lucas"
+ elsif name == "lucas"
return lucas(n)
end
lucas(n) + fibonacci(n)
end

Диана обнови решението на 10.10.2014 12:42 (преди около 10 години)

FI = (1 + Math.sqrt(5))/2
def fibonacci(n)
((FI**n - (- FI)**(-n))/ Math.sqrt(5)).round
end
def lucas(n)
(FI**(n - 1) + (1 - FI)**(n - 1)).round
end
def series(name, n)
- if name == "fibonacci"
- return fibonacci(n)
- elsif name == "lucas"
- return lucas(n)
+ case name
+ when "fibonacci" then return fibonacci(n)
+ when "lucas" then return lucas(n)
+ when "summed" then return lucas(n) + fibonacci(n)
end
- lucas(n) + fibonacci(n)
end

С дъга изглежда по-добре от преди. ( :

Вече можеш да махнеш и тези return-и от бранчовете, тъй като и трите 'сценария' са в case и той отговаря за целия control flow (за разлика от предишното решение, където ако няма return-и винаги се връща сумираната редица).

Диана обнови решението на 10.10.2014 13:22 (преди около 10 години)

FI = (1 + Math.sqrt(5))/2
def fibonacci(n)
((FI**n - (- FI)**(-n))/ Math.sqrt(5)).round
end
def lucas(n)
(FI**(n - 1) + (1 - FI)**(n - 1)).round
end
def series(name, n)
case name
- when "fibonacci" then return fibonacci(n)
- when "lucas" then return lucas(n)
- when "summed" then return lucas(n) + fibonacci(n)
+ when "fibonacci" then fibonacci(n)
+ when "lucas" then lucas(n)
+ when "summed" then lucas(n) + fibonacci(n)
end
end

Имам въпрос. По-добре ли е, ако е в този вид? Как да го оставя? И изобщо по-четимо ли е? :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 на първи и четвърти ред от първото решение.

Диана обнови решението на 10.10.2014 20:52 (преди около 10 години)

-FI = (1 + Math.sqrt(5))/2
+FI = (1 + Math.sqrt(5)) / 2
def fibonacci(n)
- ((FI**n - (- FI)**(-n))/ Math.sqrt(5)).round
+ ((FI**n - (-FI)**(-n)) / Math.sqrt(5)).round
end
def lucas(n)
(FI**(n - 1) + (1 - FI)**(n - 1)).round
end
def series(name, n)
case name
when "fibonacci" then fibonacci(n)
when "lucas" then lucas(n)
when "summed" then lucas(n) + fibonacci(n)
end
end

Гошо, подвел си я. 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: Оппа. Аз я подвеждам. Извинения :blush: В нашия Style Guide било друго.

Диана обнови решението на 13.10.2014 13:41 (преди около 10 години)

-FI = (1 + Math.sqrt(5)) / 2
+# http://mathforum.org/library/drmath/view/51448.html
+PHI = (1 + Math.sqrt(5)) / 2
def fibonacci(n)
- ((FI**n - (-FI)**(-n)) / Math.sqrt(5)).round
+ ((PHI**n - (-PHI)**(-n)) / Math.sqrt(5)).round
end
def lucas(n)
- (FI**(n - 1) + (1 - FI)**(n - 1)).round
+ (PHI**(n - 1) + (1 - PHI)**(n - 1)).round
end
def series(name, n)
case name
when "fibonacci" then fibonacci(n)
when "lucas" then lucas(n)
when "summed" then lucas(n) + fibonacci(n)
end
end

Поизпуснах срока. До колкото помня, според стайл гайда няма там, но щ. погледна пак. Относно решението: първия семестър имахме дискретни структури при Минко Марков и специален час за рекурсиите (чак се падна и на изпита) и един от примерите, разбира се, беше Фибоначи. Естествено, може да се приложи и за Лукас...и реших, че ще е похабена година, ако поне не приложа знанията си от нея.