2

我正在编写一个返回斐波那契数列中第 n 个元素的方法,但遇到了意外的结束错误。

def fib_seq(n)

  a = [0]

  n.times do |i|
    if i==0
      a[i] = 0
    else if i==1
      a[i] = 1
    else
      a[i] = a[i-1] + a[i-2]
    end  
  end

  return a[n]
end

puts fib_seq(4)

关于我可以搞砸的任何提示?

4

3 回答 3

4

假设您试图返回第 n 个(而不是第 (n-1) 个,即 fib(1) = 0 NOT fib(0) = 0)。

我通过更改来修复它:

else if i==1

elsif i==1

(和)

return a[n]

return a[n - 1]

所以你的最终代码应该是这样的:

def fibSeq(n)

  a = [0]

  n.times do |i|
    if i==0
      a[i] = 0
    elsif i==1
      a[i] = 1
    else
      a[i] = a[i-1] + a[i-2]
    end  
  end

  return a[n-1]
end

puts fibSeq(4)

根据您在下面的评论,以下代码将起作用:

def fibSeq(n)

  a = [0]

  (n+1).times do |i|
    if i==0
      a[i] = 0
    elsif i==1
      a[i] = 1
    else
      a[i] = a[i-1] + a[i-2]
    end  
  end

  return a[n]
end

puts fibSeq(4)

如果要将 fibs 输出为列表,请使用:

return a[0..n]

代替

return a[n]
于 2012-09-20T00:17:08.477 回答
2

非常优化的代码

版本 1

def fib(n, cache)
  return 1 if n <= 2
  return cache[n] if cache[n]
  cache[n] = fib(n - 1, cache) + fib(n - 2, cache)
end

cache = {}
puts fib(5,cache)

版本 2

def fib(n)
 return 1 if n <= 2
 fib_index = 3
 a, b = 1, 1
 while fib_index <= n
   c = a + b
   a = b
   b = c
   fib_index += 1
 end
c
end

puts fib(100)
于 2017-04-07T21:13:50.313 回答
1

如果你去递归,这是伪代码:

fib(n) {
    if n = 0 -> return 0
    else if n = 1 -> return 1
    else -> return fib(n-1) + fib (n-2)
}
于 2012-09-20T00:17:55.957 回答