尾递归

作者: Tomtoms | 来源:发表于2019-11-09 11:43 被阅读0次

    尾递归

    • Lua尾递归的实现

    爆栈问题

    基于栈实现函数调用的语言都有栈空间的上限,这里拿几个语言举例

    #include <stdio.h>
    
    int foo(int n){
        printf("%d\n", n);
        return foo(n+1);
    }
    
    int main()
    {
        foo(1);
        return 0;
    }
    

    运行到258914次的时候出现segmentation fault

    258911
    258912
    258913
    258914
    [1]    25175 segmentation fault  ./trait
    
    def foo(n):
        print(n)
        return foo(n+1)
    
    foo(1)
    

    运行到992次就爆栈了

    993
    994
    995
    996
    Traceback (most recent call last):
      File "trait.py", line 5, in <module>
        foo(1)
      File "trait.py", line 3, in foo
        return foo(n+1)
      File "trait.py", line 3, in foo
        return foo(n+1)
      File "trait.py", line 3, in foo
        return foo(n+1)
      [Previous line repeated 992 more times]
      File "trait.py", line 2, in foo
        print(n)
    RecursionError: maximum recursion depth exceeded while calling a Python object
    

    如何解决

    解决爆栈的方式无非就两种

    • 尾递归(Goto实现的状态机)
    • 不解决

    Go和lua的实现

    function foo(n)
        print(n)
        return foo(n+1)
    end
    foo(1)
    
    package main
    
    import "fmt"
    
    func foo(n int) int {
        fmt.Println(n)
        return foo(n+1)
    }
    
    func main() {
        foo(1)
    }
    

    相关文章

      网友评论

          本文标题:尾递归

          本文链接:https://www.haomeiwen.com/subject/ytagbctx.html