zoukankan      html  css  js  c++  java
  • 函数递归以及尾递归调用

    什么是递归?


    用通俗的话来说就像问路,张三问李四,李四问王五,王五问赵六   赵六知道答案回复了王五,王五回复了李四,李四回复了张三,问路结束

    官方的定义是一个函数调用其本身

    递归的特性


    1.必须有一个明确的停止条件

    2.每次更深入一层递归时,问题规模要比上次递归都应有所减小

    3.递归次数不能太多,否则会造成栈溢出

    递归的代码示例


     

    递归函数在某些时候具有代码逻辑十分清晰的效果,比如在算数的阶乘的时候。阶乘的定义为n! = 1 × 2 × 3 × … × n,示例代码如下所示:

    def jiecheng(n):
        if n==1:
            return n
        else:
            return n*jiecheng(n-1)
    
    res = jiecheng(5)
    print(res)  #打印结果为120

     递归的优化方法之尾递归优化


    因为暂时写不出例子,用以下代码来讲解尾递归优化是怎么一回事儿

    #不属于尾递归调用
    def test1(n):
        if n==1:
            return n
        else:
            return n*test1(n-1)
    #属于尾递归调用
    def test2(n):
        if n==1:
            return n
        else:
            return test2(n-1)

    以上两行代码的区别就在于最后一步,不属于尾递归调用的那个最后一行代码实际上执行步骤如下

    res = test1(n-1)  #1

    res = n* res   #2

    在执行第一步的时候跳入第二层函数的时候需要保存第一层函数的位置,变量等信息在栈中

    而属于尾递归调用的最后一行代码执行步骤如下

    res = test1(n-1)  #1

    在跳入第二层函数的时候第一层的函数实际上已经结束,不需要保存第一层函数相关的所有信息了。

    所以尾递归调用可以减轻栈的负荷

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/codescrew/p/8661044.html
Copyright © 2011-2022 走看看