【问题标题】:Why does my Fibonacci series using Ruby's inject doesn't work?为什么我使用 Ruby 注入的斐波那契数列不起作用?
【发布时间】:2011-11-19 20:20:00
【问题描述】:

这很尴尬,我不明白为什么这行代码没有返回给我斐波那契数列,而只是一系列数。

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

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

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

一如既往的感谢。

【问题讨论】:

  • 顺便提一下,你们认为递归执行它比这更容易吗?

标签: ruby algorithm fibonacci


【解决方案1】:

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]

-编辑- 顺便说一句,你不需要 ;arr 最后,

【讨论】:

  • 酷!我怎么没看到!?谢谢!
  • 我会告诉你这一点,因为你是第一个回答的,(感谢你让我知道我不需要最后的 ; arr)谢谢先生!
  • 我假设您选择的主要语言是 C 或 C++
【解决方案2】:

arr.last-1 不会为您提供数组的倒数第二个元素。它取最后一个元素并从中减去一个。

您想要arr[arr.length - 2] 或花哨的Ruby 快捷方式arr[-2] 之类的东西。

【讨论】:

  • 谢谢!这样的菜鸟错误..您的解决方案与第一个人相同,但仍然感谢您!
【解决方案3】:

我不了解 Ruby,所以这可能完全关闭,但似乎这可能是你的罪魁祸首:

arr.last + arr.last-1

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

arr.last + (arr.last)-1

请注意,如果您使用 1 为数组设定种子,这将返回 1 + 1 - 1 = 1,这意味着您的条件始终计算为 1,这可能不是您想要的。

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

【讨论】:

  • 谢谢,我知道这与我使用最后一种方法的方式有关。
【解决方案4】:

首先我们不要忘记这个系列实际上是从 0 开始的,还有一种更简单的方法可以做到这一点:

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

享受吧!

【讨论】:

  • 你的解决方案很酷。很干净,我喜欢,谢谢你的贡献韦斯!
【解决方案5】:

如果您真的喜欢使用 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]

【讨论】:

    【解决方案6】:

    最短路径:

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

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2014-09-10
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多