python中的Fibonacci,递归地进入列表

时间:2016-06-14 02:44:24

标签: python python-2.7 recursion

我正在练习一些代码,我想要做的一件事是将Fibonacci序列递归地放入列表中。我没有递归就设法做到了,但这并不太难。感谢能提供任何帮助的任何人。

 InternetExplorerOptions options = new InternetExplorerOptions {EnableNativeEvents = false};

 WebDriver driver = new InternetExplorerDriver(ConfigurationManager.AppSettings["IDEServerPath"], options, TimeSpan.FromMinutes(2));

6 个答案:

答案 0 :(得分:1)

干预您的代码。你会发现

arr.append(tmp)
  return arr

以上代码永远不会被执行,因为它在if-else条件之前返回了答案。

以下代码有助于:

arr = []
n=15
def Fib(n):

  if arr[n] != -1:
    return arr[n]
  if n == 0:
    arr[0] = 0
    return 0 #base case 1
  elif n == 1:
    arr[1] = 1;
    return 1  #base case 2
  else:
    arr[n] = Fib(n-1) + Fib(n-2);
    return arr[n];

for i in range(n+1):
    arr.append(-1);
Fib(n)
print arr

我正在做的是,最初我正在为列表中的所有索引分配-1,告诉我从未访问过这个特定的状态。有一次,我访问了一个特定的状态,我将其解决方案存储在该索引的arr中。如果解决方案状态已被访问并再次遇到,我会立即在该索引处返回可能的解决方案,而不会在其上进一步递归。

答案 1 :(得分:1)

在Python 3中,您可以使用lru_cache执行高效的递归实现,它会缓存最近计算的函数结果:

from functools import lru_cache

@lru_cache(100)
def fib(N):
    if N <= 1:
        return 1
    return fib(N - 1) + fib(N - 2)

[fib(i) for i in range(10)]
# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

这也可以在没有缓存的情况下工作,但对于这种情况,计算复杂度在N中是指数级的。

答案 2 :(得分:0)

更快的方式

def Fib():
    a,b = 0,1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b

from itertools  import islice 

for i in islice(Fib(),15):
    print i

答案 3 :(得分:0)

这是一个解决方案:

def fib(n, sofar=[]):
  if n == 0:
    return sofar

  if len(sofar) < 2:
    return fib(n-1, sofar + [1])

  return fib(n-1, sofar + [sofar[-1] + sofar[-2]])

print(fib(11))

答案 4 :(得分:0)

你也可以这样做:

    def fibonacci(n):
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fibonacci(n-2) + fibonacci(n-1)

    number = int(input("Enter the range of numbers: "))

    result = []
    start = 1
    for num in range(start, number+1):
        result.append(fibonacci(num))
    print(result)

    # Output
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

答案 5 :(得分:0)

尝试以下递归方法。

# Where 'n' is the max range of a number in Fibonacci series 
def fibo(n, a = 0, b = 1, fib = []):
    if b < n:
        fib.append(b)
        a, b = b, a + b
    else:
        return fib
    return fibo(n, a, b, fib)


print fibo(20)

<强>输出

[1, 1, 2, 3, 5, 8, 13]