我正在练习一些代码,我想要做的一件事是将Fibonacci序列递归地放入列表中。我没有递归就设法做到了,但这并不太难。感谢能提供任何帮助的任何人。
InternetExplorerOptions options = new InternetExplorerOptions {EnableNativeEvents = false};
WebDriver driver = new InternetExplorerDriver(ConfigurationManager.AppSettings["IDEServerPath"], options, TimeSpan.FromMinutes(2));
答案 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]