Почему моя серия Фибоначчи, использующая инъекцию Руби, не работает? - PullRequest
2 голосов
/ 19 сентября 2011

Это неловко, я не понимаю, почему эта строка кода возвращает мне не ряд Фибоначчи, а просто серию из них.

(1..5).inject([1]) { |arr, x| x > 1 ? arr << arr.last + arr.last-1 : arr << 1; arr }

Предполагается, что приведенный выше коднайдите первые шесть чисел в серии.

Подскажите, пожалуйста, что я делаю не так?

Спасибо, как всегда.

Ответы [ 5 ]

4 голосов
/ 19 сентября 2011

arr.last-1 не работает, вместо этого попробуйте arr [-2]:

p (1..5).inject([1]) { |arr, x| x > 1 ? arr << arr.last + arr[-2] : arr << 1 }
#=>[1, 1, 2, 3, 5, 8]

-edit- кстати, вам это не нужно; arr в конце << возвращает массив по умолчанию </p>

3 голосов
/ 19 сентября 2011

arr.last-1 не дает вам второй-последний элемент массива.Он берет последний элемент и просто вычитает из него один.

Вы хотите что-то вроде arr[arr.length - 2] или причудливый ярлык Ruby arr[-2].

2 голосов
/ 19 сентября 2011

Я не знаю Ruby, так что это может быть полностью отключено, но кажется, что это может быть вашим виновником:

arr.last + arr.last-1

Я не думаю, что это означает "последний элемент массива плюсэлемент перед ним, "а точнее

arr.last + (arr.last)-1

Обратите внимание, что если вы начнете массив с 1, это вернет вам 1 + 1 - 1 = 1, что означает, что ваши термины всегда будут равны единице,что, вероятно, не то, что вы хотите.

Дайте мне знать, если это полностью отключено, и надеюсь, что это поможет!

1 голос
/ 07 мая 2015

И еще один способ, если вам действительно нравится использовать inject:)

(1..20).inject( [0, 1] ) { | fib | fib << fib.last(2).inject(:+) }
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946]
1 голос
/ 29 февраля 2012

Во-первых, давайте не будем забывать, что серия фактически начинается с 0, и есть гораздо более простой способ сделать это:

1.9.2-p290 :009 > 4.times.inject([0,1]) {|s| s + [s[-1] + s[-2]]}
 => [0, 1, 1, 2, 3, 5] 

Наслаждайтесь!

...