zoukankan      html  css  js  c++  java
  • 数据结构之递归

    定义:一个函数直接或间接调用自己

    递归需要满足的三个条件:

      1.递归必须有一个明确的中止条件

      2.该函数所处理的数据规模必须在递减

      3.这个转化必须是可解的

    循环和递归:

      递归:

        易于理解

        速度慢,存储空间大

      循环:

        不易理解

        速度快,存储空间小

    举例:

    1.求阶乘

      这一个所知道的信息就是  n! = n * (n-1)!;

      这个时候,我们可以让程序不停的调用这个方法以便达到这种所谓的结果。

      

     1 #include <stdio.h>
     2 long sum(long n);
     3 long sum(long n){
     4     long kk = 1;
     5     if(n ==1){
     6         return kk;
     7     }else{
     8         kk = n * sum(n-1);
     9         return kk;
    10     }
    11 }
    12 int main(void){
    13     printf("fff   %l
    ",sum(32));
    14     return 0;
    15     
    16 }

    //在程序中需要注意的是:C语言里面没有比较明确的规定long和int的字节数,所以如果大于字节范围就会出现变成零的可能性.

    2.1+2+3+..+100 的和

      PS:这里就不再贴代码与上面概念一致

      

       函数的调用:

          当在一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:

            1).将所有的实际参数,返回地址等信息传递给被调函数保存。

             2).为被调函数的局部变量(也包括形参)分配存储空间

            3).将控制转移到被调函数的入口

          从被调函数返回主调函数之前,系统也要完成三件事:

            1).保存被调函数的报错结果

            2).释放被调函数所占的存储空间

            3).依照被调函数保存的返回地址将控制转义到调用函数。

    3.汉诺塔

      汉诺塔最主要的就是三个步骤:

        1)将n-1个盘子从A经C移到B

        2)将n从A直接移到C

        3)将n-1个盘子从B经A移到C

        

     1 #include <stdio.h>
     2 
     3 void hannuota(int n,char A,char B,char C){
     4     
     5     if(1 == n){
     6         printf("将编号为%d的盘子从%c移到%c
    ",n,A,C);
     7     }else{
     8         
     9         hannuota(n-1,A,C,B);
    10         printf("将编号为%d的盘子从%c移到%c
    ",n,A,C);
    11         hannuota(n-1,B,A,C);
    12     }
    13     return;    
    14 }
    15 
    16 
    17 int main(void){
    18     
    19     int n;
    20     char ch1 = 'A';
    21     char ch2 = 'B';
    22     char ch3 = 'C';
    23     printf("请输入A柱子上面原始有的盘子个数!");
    24     scanf("%d",&n);
    25     printf("
    ");
    26     hannuota(n,ch1,ch2,ch3);
    27     
    28     return 0;
    29 }

    4.走迷宫

    递归的应用

       1.树和森林就是以递归的方式定义的

      2.数和图的很多算法就是递归实现的

      3.很多数学公式就是以递归的方式定义的

        例如:斐波拉基序列:1 1 2 3 5 ...

      

  • 相关阅读:
    js语言结构小记(一)
    jquery插件:fancybox
    转载(深刻地了解到了js数组是引用类型)
    sqlite 页面结构分析
    有限状态机(FSM)的设计与实现(二)
    sqlite源码中的一个潜在Bug
    一种整数数据压缩存储的算法实现
    构建自己的内存池(一)
    sqlite Btree结构分析
    构建自己的内存池(二)
  • 原文地址:https://www.cnblogs.com/strator/p/7255844.html
Copyright © 2011-2022 走看看