Python 为什么这个递归映射函数使用所有可用内存?
我试图在Python中使用递归实现map函数,并在GoogleColab上运行它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
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”案例有一个错误。好吧,我需要冷静一点。谢谢你的帮助。非常感谢。