繁体   English   中英

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

[英]Why is this recursive map function using all available memory?

我正在尝试使用递归在 Python 中实现 map 函数,并在 Google Colab 上运行它。

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)

我得到的错误是: Your session crashed after using all available 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]

当您递归时,您需要将较短的列表传递给itr[1:] mapr() ,例如itr[1:] 但是您正在传递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:] ,而不是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM