这是我在MyProgrammingLab中分配的问题之一。我已尝试超过45次回答此问题,但无法做到正确。 任何帮助将不胜感激
问题: 在以下序列中,每个数字(前两个除外)是前两个数字的总和:0,1,1,2,3,5,8,13 ......这个序列称为Fibonacci序列
我们说的是序列的第i个元素(从0开始) - 因此第0个元素是0,第1个元素是1,第2个元素是1,第3个元素是2,依此类推。给定正整数n,将斐波那契序列的第n个值与变量结果相关联。例如,如果n与值8相关联,那么结果将与21相关联。
我的工作:
def fib(n):
if n <= 1:
result == n
elif n >= 1:
result = fib(n-1)+fib(n-2)
else:
return result
答案 0 :(得分:1)
这是因为在所有情况下,分配结果但不返回结果。
因此,例如,当调用fib(1)
时,Python返回None
,因为在这种情况下你从未告诉它返回result
。同样的事情发生在fib(45)
。
要解决此问题,请始终返回result
。 (无论您编写什么类型的程序,这都是一个好主意 - 函数应始终具有明确的返回值。)
def fib(n):
if n <= 1:
result = n
elif n > 1:
result = fib(n-1)+fib(n-2)
return result # always return result!
您应该知道斐波那契序列的这种实现效率最低。如果你可以完全抛弃递归调用并只使用while
循环来计算fib(n)
- 或者,如果你想要递归,则存储先前计算的fib(n)
值,而不是强制它计算全部通往fib(n)
的方式 - 您将获得更高效的实施。
您的代码包含许多问题,例如
==
代替=
。第一个检查左侧和右侧是否相等,并返回True
或False
。第二个实际上将右侧的值分配给左侧的变量。不要混淆检查平等与分配。if-else
语句的重点是在不同情况下执行不同的事物。 答案 1 :(得分:0)
def fib(n):
if n < 2:
return n
else:
return fib(n-1)+fib(n-2)
你可以从根本上减少它。你甚至可以忽略其他人并说:
def fib(n):
if n < 2:
return n
return fib(n-1)+fib(n-2)
但是你说你出于某种原因需要有一个其他案例。
答案 2 :(得分:0)
我为任务写了这个。我知道这有点间接,但这很重要,这很重要:)
n = int(input("Insert a number: "))
i = 0
fib_list = [1, 1, 0]
for i in range (0,2):
if n == 0:
result = fib_list[2]
elif n <= 2:
result = fib_list[0]
for i in range (2,n):
result = fib_list[0] + fib_list[1]
fib_list.insert(0, result)
i += 1
result = fib_list[0]
顺便说一句,您无需定义要在myprogramminglab问题中使用的输入。
我在此处添加了输入版本,因为我在测试中使用了它。