• 递归



    1. 递归的定义

    在定义一个函数时出现调用本函数的过程称为递归。


    1.1 以下为求 n! 的递归函数,理解一下递归

    int fun(int n)
    {
        if(n == 1)
            return 1;
        else
            return ( fun(n - 1) * n );
    }
    

    1.2 递归的过程(举例求 5 的阶乘 fun(5) )

    递归是代码共享的,也就是用同一个函数的代码,系统会为每一次调用开辟一组储存单元来存放本次调用的返回地址和被中断的函数的参数值。

    2. 递归的条件

    1.必须是有结束递归的条件
    
    2.必须是有限的调用次数
    
    3.必须是在调用过程中数量规模递减
    


    3. 递归的利弊

    利:结构简单,便于阅读
    
    弊:占用内存多,效率低,还可能栈溢出。
    

    补充:

    CPU使用栈的方式来支持递归函数的调用操作,进入函数时为局部变量分配存储空间,退出时收回这部分空间。每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。




    4. 递归的应用


    4.1 汉诺塔问题

    将盘片从 x 移到 z ,且小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘

    void Hanoil(int n,char x,char y,char z)
    {
        if(n == 1)
            printf("第%d个盘片从%c移到%c",n,x,z);
        else
        {
            Hanoil(n-1,x,z,y);							//将n-1个盘片借助z,从x移动到y
            printf("第%d个盘片从%c移到%c",n,x,y);		   //将第n个盘片从x移动到z
            Hanoil(n-1,y,x,z);							//将剩下的n-1个盘片借助x,从y移动到z
        } 
    }
    

    4.2 广度优先搜索



  • 相关阅读:
    ISAPI Extension和ISAPI Filter
    Windows Debugging之二
    Windows Debugging之三
    举例一些可执行文件的后缀名
    Windows Debugging 之一
    [转]C# 日期函数
    在DataGridView中的CellEndEdit事件中删除当前行报错
    一个奇怪的问题
    [转载]如何发送和接收 Windows Phone 的 Toast 通知
    【转载】如何播放 Windows Phone 的后台音频
  • 原文地址:https://www.cnblogs.com/Howlet/p/11767817.html
Copyright © 2020-2023  润新知