Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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 为什么这个递归映射函数使用所有可用内存?_Python - Fatal编程技术网

Python 为什么这个递归映射函数使用所有可用内存?

Python 为什么这个递归映射函数使用所有可用内存?,python,Python,我试图在Python中使用递归实现map函数,并在GoogleColab上运行它 def randfun(var): return var * 2 def mapr(f, itr): if len(itr) == 1: return f(itr[0]) else: amendedlist = list(mapr(randfun, f(itr[1:]))) #print(amendedlist) return

我试图在Python中使用递归实现map函数,并在GoogleColab上运行它

def randfun(var):
    return var * 2

def mapr(f, itr):
    if len(itr) == 1:
        return f(itr[0])
    else:
        amendedlist = list(mapr(randfun, f(itr[1:])))
        #print(amendedlist)
        return amendedlist

li = [1,2,3,4,5]
result = mapr(randfun, li)
print(result)
我得到的错误是:
您的会话在使用所有可用RAM后崩溃。它会产生一堆日志,我无法解密,但我很乐意复制

看起来代码无法停止递归,并且它无限继续,但我还是不确定。我做错了什么?

这对我很有用

def randfun(var):
    return var * 2

def mapr(f, itr):
    if len(itr) == 1:
        return [f(itr[0])]
    amendedlist = [f(itr[0])] + mapr(f, itr[1:])
    return amendedlist

li = [1,2,3,4,5]
result = mapr(randfun, li)
print(result) #[2, 4, 6, 8, 10]
这对我有用

def randfun(var):
    return var * 2

def mapr(f, itr):
    if len(itr) == 1:
        return [f(itr[0])]
    amendedlist = [f(itr[0])] + mapr(f, itr[1:])
    return amendedlist

li = [1,2,3,4,5]
result = mapr(randfun, li)
print(result) #[2, 4, 6, 8, 10]

递归时,需要将较短的列表传递给
mapr()
,例如
itr[1:://code>。但是您传递的是
f(itr[1:])
。当
itr==[1,2,3,4,5]
时,
f(itr[1:])
f([2,3,4,5])
,即
[2,3,4,5,2,3,4,5]
。因此,争论变得越来越短,而不是越来越长,而且你永远无法达到基本情况

递归应该只传递
itr[1://code>,而不是
f(itr[1:])
,因为
f()
的参数应该是列表元素,而不是列表本身

你的基本情况也是错误的
mapr()
必须始终返回列表,但在基本情况下,您只是返回函数的结果,而没有将其包装到列表中

最好使用空列表作为基本情况,因此该函数适用于空列表

def mapr(f, itr):
    if len(itr) == 0:
        return []
    else:
        amendedlist = [f(itr[0])] + mapr(f, itr[1:])
        #print(amendedlist)
        return amendedlist

递归时,需要将较短的列表传递给
mapr()
,例如
itr[1:://code>。但是您传递的是
f(itr[1:])
。当
itr==[1,2,3,4,5]
时,
f(itr[1:])
f([2,3,4,5])
,即
[2,3,4,5,2,3,4,5]
。因此,争论变得越来越短,而不是越来越长,而且你永远无法达到基本情况

递归应该只传递
itr[1://code>,而不是
f(itr[1:])
,因为
f()
的参数应该是列表元素,而不是列表本身

你的基本情况也是错误的
mapr()
必须始终返回列表,但在基本情况下,您只是返回函数的结果,而没有将其包装到列表中

最好使用空列表作为基本情况,因此该函数适用于空列表

def mapr(f, itr):
    if len(itr) == 0:
        return []
    else:
        amendedlist = [f(itr[0])] + mapr(f, itr[1:])
        #print(amendedlist)
        return amendedlist

无限循环会导致Execution崩溃,因为
var*2
实际上会使列表相乘。也就是说,
var
itr[1:][/code>,你把它乘以2,它增加了它的大小,因此你得到了无限的递归。
f(itr[1:])
解析为
randfun([2,3,4,5])
它给你
[2,3,4,5]*2=[2,3,4,5]
等等,也就是说,每次迭代都会增加
itr
。通过一些打印语句,您可以看到问题以及
var*2
没有做您认为它做的事情的原因(看起来):递归地做
map
只会使事情复杂化。有更好的练习来研究递归。无限循环崩溃执行,因为
var*2
实际上是列表本身的倍数。也就是说,
var
itr[1:][/code>,你把它乘以2,它增加了它的大小,因此你得到了无限的递归。
f(itr[1:])
解析为
randfun([2,3,4,5])
它给你
[2,3,4,5]*2=[2,3,4,5]
等等,也就是说,每次迭代都会增加
itr
。通过一些打印语句,您可以看到问题以及
var*2
没有做您认为它做的事情的原因(看起来):递归地做
map
只会使事情复杂化。有更好的练习来研究递归。我不敢相信我犯了传递f(itr[1:])而不是仅仅传递itr[1:]。。。!!!!如果我在同事们之前就这样做,我会尴尬至死。另外,我的“else”案例有一个错误。好吧,我需要冷静一点。谢谢你的帮助。非常感谢。我不敢相信我犯了通过f(itr[1:])而不是仅仅通过itr[1:]。。。!!!!如果我在同事们之前就这样做,我会尴尬至死。另外,我的“else”案例有一个错误。好吧,我需要冷静一点。谢谢你的帮助。非常感谢。