Это неловко, я не понимаю, почему эта строка кода возвращает мне не ряд Фибоначчи, а просто серию из них.
(1..5).inject([1]) { |arr, x| x > 1 ? arr << arr.last + arr.last-1 : arr << 1; arr }
Предполагается, что приведенный выше коднайдите первые шесть чисел в серии.
Подскажите, пожалуйста, что я делаю не так?
Спасибо, как всегда.
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>
arr.last-1 не дает вам второй-последний элемент массива.Он берет последний элемент и просто вычитает из него один.
arr.last-1
Вы хотите что-то вроде arr[arr.length - 2] или причудливый ярлык Ruby arr[-2].
arr[arr.length - 2]
arr[-2]
Я не знаю Ruby, так что это может быть полностью отключено, но кажется, что это может быть вашим виновником:
arr.last + arr.last-1
Я не думаю, что это означает "последний элемент массива плюсэлемент перед ним, "а точнее
arr.last + (arr.last)-1
Обратите внимание, что если вы начнете массив с 1, это вернет вам 1 + 1 - 1 = 1, что означает, что ваши термины всегда будут равны единице,что, вероятно, не то, что вы хотите.
Дайте мне знать, если это полностью отключено, и надеюсь, что это поможет!
И еще один способ, если вам действительно нравится использовать inject:)
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]
Во-первых, давайте не будем забывать, что серия фактически начинается с 0, и есть гораздо более простой способ сделать это:
1.9.2-p290 :009 > 4.times.inject([0,1]) {|s| s + [s[-1] + s[-2]]} => [0, 1, 1, 2, 3, 5]
Наслаждайтесь!