Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 斐波那契回忆录:无法理解TypeError的原因_Python_Python 3.x_Algorithm_Dynamic Programming_Memoization - Fatal编程技术网

Python 斐波那契回忆录:无法理解TypeError的原因

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返回一个数字(如果它

刚开始学习动态规划和记忆,以生成第n个斐波纳契数为例。我写了下面的代码(实际上是从一个网站上获得了帮助),删除了它并尝试自己写一次。回电有一个问题(TypeError),我无法理解

我将返回备忘录[x]调用缩进到if语句下面,程序正常运行,从而修复了这个问题

我只想知道以下代码中出现错误的原因:

代码的作用是什么

1) 创建用于记忆输入函数的函数

2) 子函数“helper”,检查输入函数的输出是否在名为“memo”的字典中。如果没有,则会根据需要更新字典

整个函数从memo返回一个数字(如果它已经在memo中),以避免不必要的分支

3) 使用递归算法创建生成斐波那契数的函数

4) 记录Fib编号生成器并打印第n个Fib编号

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请查看简要说明