为什么使用Ruby注入的斐波那契系列不起作用?

时间:2011-09-18 21:33:20

标签: ruby algorithm fibonacci

这很令人尴尬,我不知道为什么这行代码没有归还给我的Fibonnacci系列,而只是一系列代码。

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

上面的代码应该找到系列中的前六个数字。

你能告诉我我做错了什么吗?

一如既往地感谢你。

6 个答案:

答案 0 :(得分:4)

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]

CNC中 顺便说一下,你不需要那个;最后是arr,&lt;&lt;默认返回数组

答案 1 :(得分:3)

arr.last-1没有给出数组的倒数第二个元素。它需要最后一个元素,只需从中减去一个元素。

您想要arr[arr.length - 2]或花哨的Ruby快捷方式arr[-2]

答案 2 :(得分:2)

我不认识Ruby,所以这可能完全没有了,但似乎这可能是你的罪魁祸首:

arr.last + arr.last-1

我不认为这意味着“最后一个数组元素加上之前的元素”,而是

arr.last + (arr.last)-1

请注意,如果您使用1播种数组,则会返回1 + 1 - 1 = 1,这意味着您的术语总是评估为1,这可能不是您想要的。

如果完全关闭,请告诉我,希望这会有所帮助!

答案 3 :(得分:1)

首先让我们不要忘记系列实际上以0开头,并且有一种更简单的方法:

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

享受!

答案 4 :(得分:1)

还有另外一种方法,如果您真的想使用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]

答案 5 :(得分:0)

最短路径:

(1..10).inject( [0, 1] ) { |sum| sum << sum.last(2).sum }
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]