Python 使用递归函数代替循环

Python 使用递归函数代替循环,python,recursion,Python,Recursion,我想用递归的方法建立一个得分矩阵 for i in range(1, len(str1)) for j in range(1, len(str)) #do something 我的代码: def matrix_bulid(index_1, index_2): print(index_1, index_2) if index_1 == len(first_dna) and index_2 == len(second_dna):

我想用递归的方法建立一个得分矩阵

    for i in range(1, len(str1))
        for j in range(1, len(str))
        #do something
我的代码:

def matrix_bulid(index_1, index_2):
    print(index_1, index_2)
    if index_1 == len(first_dna) and index_2 == len(second_dna):
        return
    elif index_2 == len(second_dna):
        return matrix_bulid(index_1 + 1, 1)
    else:
    #do something
            matrix_bulid(index_1, index_2 + 1)
但在很长的字符串中,我得到了最大深度误差。
有人知道怎么做吗?

如果您的目标是将嵌套的for循环变成一个简单的递归函数,那么您已经成功地做到了。有一些错误(错误的缩进,在第二种递归情况下不返回任何内容,…),但基本结构是可靠的

不幸的是,递归函数受堆栈深度的限制。有些语言具有尾部调用消除,这意味着尾部递归函数没有边界。您的实现是尾部递归的。但是Python(有意地)没有这个特性,所以这无关紧要;您仍然只能处理长度不超过的字符串

如果字符串是有界的,但是对于默认递归限制(在CPython中为1000)来说有点太大,那么可以使用将其设置得更高

在Python中还有一些模拟尾部调用消除的技巧,我将在下面讨论。但是,即使使用尽可能好的技巧,递归代码仍然比嵌套循环更长、更不明显、更不符合Pythonic,而且速度也更慢

如果你在做家庭作业,你可能已经做完了。除非您可以选择编程语言,否则在这种情况下,您将需要选择具有尾部调用消除功能的语言。如果您是为真正的代码这样做的,您应该坚持使用原始的嵌套循环。代码更简单,运行速度更快,并且没有堆栈限制,不需要任何复杂的东西


在CPython中实现尾部调用优化的最有效方法是修改编译函数的字节码,如图所示。但这也是最骇客的方式,它只在有限的环境下有效

最简单的方法是修改您的函数以返回一个返回值的函数,而不是一个值,然后使用蹦床将计算链接在一起(至少有两篇博客文章展示了这种技术,以及)。但是,虽然这是最简单的实现,但它需要通过实际的递归函数进行更改,这会使它们更复杂,可读性更低


最好的折衷方法是使用一个在每个递归步骤中间插入一个蹦床的装饰器,这样你就不需要显式地延迟函数调用,如所见。如果您有相互递归的函数,这可能会有点棘手,但这很少是很难弄清楚的。而且实现非常容易理解。而且它并不比字节码黑客慢多少。

不要使用递归?重复?递归并不是在所有情况下都能加速代码的方法,而只是一种解决无法通过迭代解决或适合递归的问题的方法。Faik几乎所有递归都可以通过循环完成。。。递归有时比循环(或不循环)更具可读性@JoranBeasley:所有递归都可以通过循环和显式堆栈完成。一些递归只需要一个循环就可以完成,如本例所示。但你是对的,在某些情况下,递归情况更具可读性(即使不需要堆栈),在这些情况下,只要你的有界限制远低于堆栈深度,就值得这么做。