Решение на Първа задача от Пламен Каращранов

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

Към профила на Пламен Каращранов

Резултати

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

Код

def fibonacci (number_of_element)
return 1 if number_of_element==1 || number_of_element==2
fibonacci(number_of_element-1)+fibonacci(number_of_element-2)
end
def lucas(number_of_element)
return 2 if number_of_element==1
return 1 if number_of_element==2
lucas(number_of_element-1)+lucas(number_of_element-2)
end
def summed(number_of_element)
fibonacci(number_of_element)+lucas(number_of_element)
end
def series(name ,number_of_element)
if name.eql? "fibonacci"
fibonacci(number_of_element)
elsif name.eql? "lucas"
lucas(number_of_element)
elsif summed(number_of_element)
end
end

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

........FFFF

Failures:

  1) series handles summed series for base cases
     Failure/Error: series('summed', 1).should eq 3
       
       expected: 3
            got: nil
       
       (compared using ==)
     # /tmp/d20141023-2426-17zlcc5/spec.rb:45:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) series handles summed series for odd numbers
     Failure/Error: series('summed', 7).should eq 31
       
       expected: 31
            got: nil
       
       (compared using ==)
     # /tmp/d20141023-2426-17zlcc5/spec.rb:50:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) series handles summed series for even numbers
     Failure/Error: series('summed', 8).should eq 50
       
       expected: 50
            got: nil
       
       (compared using ==)
     # /tmp/d20141023-2426-17zlcc5/spec.rb:55:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) series handles summed series for bigger numbers
     Failure/Error: series('summed', 15).should eq 1453
       
       expected: 1453
            got: nil
       
       (compared using ==)
     # /tmp/d20141023-2426-17zlcc5/spec.rb:60:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01671 seconds
12 examples, 4 failures

Failed examples:

rspec /tmp/d20141023-2426-17zlcc5/spec.rb:44 # series handles summed series for base cases
rspec /tmp/d20141023-2426-17zlcc5/spec.rb:49 # series handles summed series for odd numbers
rspec /tmp/d20141023-2426-17zlcc5/spec.rb:54 # series handles summed series for even numbers
rspec /tmp/d20141023-2426-17zlcc5/spec.rb:59 # series handles summed series for bigger numbers

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

Пламен обнови решението на 13.10.2014 17:50 (преди около 10 години)

+def fibonacci (element)
+ return 1 if (element == 1 || element == 2)
+ (fibonacci(element-1)+fibonacci(element-2))
+end
+
+def lucas(element)
+ return 2 if (element == 1)
+ return 1 if (element == 2)
+ return lucas(element - 1)+lucas(element - 2)
+end
+
+def summed(element)
+ fibonacci(element)+lucas(element)
+end
+
+def series(name ,element)
+ return fibonacci(element) if name == 'fibonacci'
+ return lucas(element) if name == 'lucas'
+ return summed(element) if name == 'summed'
+end

Пламен обнови решението на 14.10.2014 09:43 (преди около 10 години)

def fibonacci (element)
- return 1 if (element == 1 || element == 2)
- (fibonacci(element-1)+fibonacci(element-2))
+ return 1 if (element == 1 || element == 2)
+ (fibonacci(element-1)+fibonacci(element-2))
end
def lucas(element)
return 2 if (element == 1)
return 1 if (element == 2)
return lucas(element - 1)+lucas(element - 2)
end
def summed(element)
fibonacci(element)+lucas(element)
end
def series(name ,element)
return fibonacci(element) if name == 'fibonacci'
return lucas(element) if name == 'lucas'
return summed(element) if name == 'summed'
end
  • Имаш известно количество проблеми с конвенцията, главно whitespaces и ненужни скоби (но не само). Погледни style guide-a, за да ги адресираш.
  • Защо на някои методи си слагал return на последния ред, на други - не? Като цяло не поставяй return пред финалния израз, резултатът му се връща по премъчаване. return x if y се използва, ако искаш да намекнеш, че това е някакво изключение, главната логика следва след това. Може да се каже, че това е така за дъното на рекурсията, но не и в series. Когато е така слагай празен ред между изключенията и main логиката за по-добра четимост. Където не е така - пренапиши ги с case или обикновен if - elsif - else.
  • element не е много добро име. Ние не ти подаваме елемента (ако беше така изобщо нямаше да ти го искаме), а номера на елемента, който търсим.

Пламен обнови решението на 14.10.2014 17:18 (преди около 10 години)

-def fibonacci (element)
- return 1 if (element == 1 || element == 2)
- (fibonacci(element-1)+fibonacci(element-2))
+def fibonacci (number_of_element)
+ return 1 if number_of_element==1 || number_of_element==2
+
+ fibonacci(number_of_element-1)+fibonacci(number_of_element-2)
end
-def lucas(element)
- return 2 if (element == 1)
- return 1 if (element == 2)
- return lucas(element - 1)+lucas(element - 2)
+def lucas(number_of_element)
+ return 2 if number_of_element==1
+ return 1 if number_of_element==2
+
+ lucas(number_of_element-1)+lucas(number_of_element-2)
end
-def summed(element)
- fibonacci(element)+lucas(element)
+def summed(number_of_element)
+ fibonacci(number_of_element)+lucas(number_of_element)
end
-def series(name ,element)
- return fibonacci(element) if name == 'fibonacci'
- return lucas(element) if name == 'lucas'
- return summed(element) if name == 'summed'
+def series(name ,number_of_element)
+ if name.eql? "fibonacci"
+ fibonacci(number_of_element)
+elsif name.eql? "lucas"
+ lucas(number_of_element)
+elsif summed(number_of_element)
+end
end
  • Все още имаш известно количество проблеми с конвенцията, главно whitespaces. Погледни style guide-a, отново.
  • Използвай == за проверка за равенство. == и eql? в повечето случаи са еднакви с малка разлика, но == се по-четимо (по принцип и поради очакването на читателя). Тук някой е описал какво представляват четирите вида сравнения.
  • Силно ти препоръчвам да си пуснеш примерните тестове.