Python 斐波那契回忆录:无法理解TypeError的原因
刚开始学习动态规划和记忆,以生成第n个斐波纳契数为例。我写了下面的代码(实际上是从一个网站上获得了帮助),删除了它并尝试自己写一次。回电有一个问题(TypeError),我无法理解 我将返回备忘录[x]调用缩进到if语句下面,程序正常运行,从而修复了这个问题 我只想知道以下代码中出现错误的原因: 代码的作用是什么 1) 创建用于记忆输入函数的函数 2) 子函数“helper”,检查输入函数的输出是否在名为“memo”的字典中。如果没有,则会根据需要更新字典 整个函数从memo返回一个数字(如果它已经在memo中),以避免不必要的分支 3) 使用递归算法创建生成斐波那契数的函数 4) 记录Fib编号生成器并打印第n个Fib编号Python 斐波那契回忆录:无法理解TypeError的原因,python,python-3.x,algorithm,dynamic-programming,memoization,Python,Python 3.x,Algorithm,Dynamic Programming,Memoization,刚开始学习动态规划和记忆,以生成第n个斐波纳契数为例。我写了下面的代码(实际上是从一个网站上获得了帮助),删除了它并尝试自己写一次。回电有一个问题(TypeError),我无法理解 我将返回备忘录[x]调用缩进到if语句下面,程序正常运行,从而修复了这个问题 我只想知道以下代码中出现错误的原因: 代码的作用是什么 1) 创建用于记忆输入函数的函数 2) 子函数“helper”,检查输入函数的输出是否在名为“memo”的字典中。如果没有,则会根据需要更新字典 整个函数从memo返回一个数字(如果它
def记忆(f):
备忘录={}
def助手(x):
如果备忘录中没有x:
备忘录[x]=f(x)
返回备忘录[x]
返回助手
def纤维(n):
如果n==0:
返回0
如果n==1:
返回1
其他:
返回fib(n-1)+fib(n-2)
fib=记忆化(fib)
印刷(纤维蛋白原(10))
我希望它能报答第n个谎言。否。但它会在返回备忘录[x]调用中返回一个错误
错误消息:
回溯(最近一次呼叫最后一次):
文件“E:\euler25.py”,第18行,在
印刷(纤维蛋白原(10))
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
文件“E:\euler25.py”,第5行,在helper中
备忘录[x]=f(x)
文件“E:\euler25.py”,第14行,在fib中
返回fib(n-1)+fib(n-2)
TypeError:不支持+:'int'和'NoneType'的操作数类型
[在0.1s内完成,退出代码为1]
此错误消息的含义是什么?您对备忘录功能的
返回语句范围有问题:
def memoize(f):
memo = {}
def helper(x):
if x not in memo:
memo[x] = f(x)
# function should return always the memoized value
return memo[x]
return helper
问题是,在某个点上,helper
函数返回一个None
,这使得fib函数尝试在int
和None
之间执行+
,从而触发类型错误
这里有一个当您在备忘录
中已经有了它时,您不会返回任何内容,因此它隐式地不返回任何内容。取消缩进(shift+tab)您的返回
行。;)谢谢我很想知道它试图用我的错误代码返回什么。@YourAverageEuler如果函数结束时没有返回语句,它将返回None
@YourAverageEuler请查看简要说明