python - 如何消除包含控制流的Python函数中的递归

标签 python if-statement for-loop recursion while-loop

我有一个函数的形式:

def my_func(my_list):
    for i, thing in enumerate(my_list):
        my_val = another_func(thing)

        if i == 0:
            # do some stuff
        else:
            if my_val == something:
                return my_func(my_list[:-1])
            # do some other stuff

递归部分被调用得足够多以至于我得到了一个 RecursionError,所以我试图用 while 循环替换它,如 here 所解释的那样,但我不知道如何将其与函数中的控制流语句协调起来。如有任何帮助,我们将不胜感激!

最佳答案

可能有一个很好的确切答案,但从递归切换到迭代的最通用(或者可能是快速和肮脏)的方法是 manage the stack yourself .只需手动执行编程语言隐式执行的操作,并拥有您自己的无限堆栈。

在这种特殊情况下有 tail recursion .你看,my_func 递归调用结果并没有被调用者以任何方式使用,它是立即返回的。最后发生的是最深的递归调用的结果冒泡并按原样返回。这就是使@outoftime 的解决方案成为可能的原因。我们只对 into-recursion pass 感兴趣,因为 return-from-recursion pass 是微不足道的。因此 into-recursion pass 被替换为迭代。

关于python - 如何消除包含控制流的Python函数中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40452207/

相关文章:

vba - 最好的风格是什么? '<>' 或 'not ='/VBA

java - 为什么当我添加 for 循环时我的 jframe 变黑?

Python:在祖父目录中导入文件

python - Django - 新数据库,没有这样的表

java - 如何解决不使用括号的用户输入的表达式?

java - if...elseif 一次又一次输入值时出错

java - JFreeChart 将数组加载到数据集中

angularjs - 在 AngularJS 中设置循环的起始索引

python - 存储电话号码的推荐方法是什么?

python - 朴素贝叶斯高斯抛出 ValueError : could not convert string to float: 'M'