• C 递归与尾递归


    递归(Recursion)

    栈(Stack)

    • 先进后出(FILO, First In Last Out)
    • 满足了函数调用(Call)和返回(Return)的顺序
    • 需要维护每个函数调用信息直到返回后才释放,占用内存大

    递归函数

    • 基线条件(Base Condition)
    • 递归条件(Recursive Condition)
    // factorial.c
    #include <stdio.h>
    
    int fact(int n) 
    {
        if (n < 0)
            return 0;
        else if (n == 1 || n == 0)
            return 1;
        else
            return n-- * fact(n);
    }
    
    int main(void) 
    {
        for (int i = -1; i <= 10; i++)
            printf("%d! = %d
    ", i, fact(i));
    
        return 0;
    }
    

    尾递归

    • 解决递归占用内存大的问题
    • 函数中所有递归形式的调用都出现在函数的末尾
    • 当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分是,这个递归调用就是尾递归
    • 回归过程不做任何操作
    • 当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活跃记录而不是在栈中创建一个新的
    // factorial.c
    #include <stdio.h>
    
    /* a初始化为1 */
    int fact(int n, int a)
    {
        if (n < 0)
            return 0;
        else if (n == 0)
            return 1;
        else if (n == 1)
            return a;
        else
            return fact(n - 1, n * a);
    }
    
    int main(void) 
    {
        for (int i = -1; i <= 10; i++)
            printf("%d! = %d
    ", i, fact(i, 1));
    
        return 0;
    }
  • 相关阅读:
    PS插件安装
    在linux中安装Python
    快慢指针 | 环形链表
    Intel VT-x 支持但处于禁用状态开启
    函数
    连接(交叉连接、内连接、外连接、自连接)
    游标cursor 与循环fetch
    Identity 自增长标识
    Trigger 触发器
    Procedure 存储过程
  • 原文地址:https://www.cnblogs.com/noonjuan/p/12102547.html
Copyright © 2020-2023  润新知