这很令人尴尬,我不知道为什么这行代码没有归还给我的Fibonnacci系列,而只是一系列代码。
(1..5).inject([1]) { |arr, x| x > 1 ? arr << arr.last + arr.last-1 : arr << 1; arr }
上面的代码应该找到系列中的前六个数字。
你能告诉我我做错了什么吗?
一如既往地感谢你。
答案 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]