Решение на Първа задача от Венцислав Димитров

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

Към профила на Венцислав Димитров

Резултати

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

Код

def series(name, index)
case name
when 'fibonacci' then fibonacci index
when 'lucas' then lucas index
else
fibonacci(index) + lucas(index)
end
end
def fibonacci(index)
compute_sequence(1, 1, index)
end
def lucas(index)
compute_sequence(2, 1, index)
end
def compute_sequence(first, second, index)
return first if index == 1
return second if index == 2
compute_sequence(first, second, index - 1) +
compute_sequence(first, second, index - 2)
end

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

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

Finished in 0.02475 seconds
12 examples, 0 failures

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

Венцислав обнови решението на 11.10.2014 21:22 (преди около 10 години)

+def series(name, index)
+ if name == 'fibonacci'
+ fib index
+ elsif name == 'lucas'
+ lucas index
+ else
+ fib(index) + lucas(index)
+ end
+end
+
+def fib(n)
+ n <= 1 ? n : fib(n - 1) + fib(n - 2)
+end
+
+def lucas(n)
+ if n == 1
+ 2
+ elsif n == 2
+ 1
+ else
+ lucas(n - 1) + lucas(n - 2)
+ end
+end

Здравей :)

Бърз въпрос - прочете ли Ruby Style Guide? Използвал си табове, вместо два интервала.

Още няколко коментара:

  • Не съкращавай имена на променливи и функции. Не печелиш нищо от това, че си спестил няколко символа, а губиш от четимостта на кода.
  • В метода fib използваш тернарният оператор ... ? ... : .... Ще е доста по-добре ако го разделиш на два реда и използваш нормален if. Може да използваш и конструкцията return ... if .... Проблемът на тернарният оператор е, че е по-труден за четене и проследяване на логиката, особено когато има повече неща в него.
  • В lucas, ако решиш, отново можеш да използваш return ... if ... за крайните случаи.
  • Ако искаш може да разгледаш и конструкцията case ... when ... then ...

В lucas и fib има някои неща, които се повтарят, можеш ли да избегнеш повторенията по някакъв начин?

Венцислав обнови решението на 11.10.2014 22:40 (преди около 10 години)

def series(name, index)
- if name == 'fibonacci'
- fib index
- elsif name == 'lucas'
- lucas index
- else
- fib(index) + lucas(index)
- end
+ if name == 'fibonacci'
+ fibonacci index
+ elsif name == 'lucas'
+ lucas index
+ else
+ fibonacci(index) + lucas(index)
+ end
end
-def fib(n)
- n <= 1 ? n : fib(n - 1) + fib(n - 2)
+def fibonacci(n)
+ compute(1, 1, n)
end
def lucas(n)
- if n == 1
- 2
- elsif n == 2
- 1
- else
- lucas(n - 1) + lucas(n - 2)
- end
+ compute(2, 1, n)
+end
+
+def compute(first, second, n)
+ return first if n == 1
+ return second if n == 2
+ compute(first, second, n-1) + compute(first, second, n-2)
end

Така изглежда доста по-добре. :)

С case можеш да сложиш на един ред всеки случай - when условие then код и ще стане дори на по-малко редове.

Има още какво да се желае с имената, например n и compute. compute звучи добре, но само като част от името. Може да ползваш повече от една дума за име, например да добавиш какво е това, което функцията compute-ва.

Венцислав обнови решението на 11.10.2014 23:12 (преди около 10 години)

def series(name, index)
- if name == 'fibonacci'
- fibonacci index
- elsif name == 'lucas'
- lucas index
- else
- fibonacci(index) + lucas(index)
+ case name
+ when 'fibonacci' then fibonacci index
+ when 'lucas' then lucas index
+ else
+ fibonacci(index) + lucas(index)
end
end
-def fibonacci(n)
- compute(1, 1, n)
+def fibonacci(index)
+ compute_sequence(1, 1, index)
end
-def lucas(n)
- compute(2, 1, n)
+def lucas(index)
+ compute_sequence(2, 1, index)
end
-def compute(first, second, n)
- return first if n == 1
- return second if n == 2
- compute(first, second, n-1) + compute(first, second, n-2)
+def compute_sequence(first, second, index)
+ return first if index == 1
+ return second if index == 2
+ compute_sequence(first, second, index - 1) +
+ compute_sequence(first, second, index - 2)
end