zoukankan      html  css  js  c++  java
  • 【C/C++】递归算法

      所谓递归——函数的递归调用。c语言的这种特性给程序设计带来许多方便。尤其是接触数据结构时,会发现递归的出现频率非常之高,也行之有效~下面是笔者在接触递归这个东西时的一些个人总结和体会:

      1.直接或间接地调用函数本身。我们在程序设计时,往往要自己写一些函数来帮助整个解决方案的完成,有时一个函数中又要调用自身来帮助这个功能的实现。是不是被套话弄晕了?Don‘t worry~开个玩笑了。  

      2.一个简单的例子可以帮助理解递归——求阶乘。请看:

      n!=n*(n-1)!(n>=1);

        =1                 (n=0);

    这是求阶乘的公式。我们显然可以写一个子函数来求n!(记这个函数是fac),可是注意到,求n!,我就要求(n-1)!。那么问题来了,求(n-1)! 所用到的函数不还是我们写的这个fac函数吗?

    So,我们只要再次调用本身就ok了。下面给出子函数:

      int fac(int n)

      {

        int f;

        if(n<o) printf("error!");

        else if(n==0) f=1;

        else f=n*fac(n-1);

        return f;

      }

      看似好像不比循环简洁,可是,当写复杂一点的代码时,递归的优点就显露出来了。

      3.Execu me?不断调用,何其尽也?

      可以看到,上面的程序并不是一个死循环~原因就在于这句if(n==0) f=1;这就是递归的终止条件。

      总结:一个完整的递归应该有两个必要条件:1.终止条件。2.规模渐小。

      规模,又可以看做上面程序的n,他显然是渐小的。

      4.递归的两个分类

      1) 基于数学公式(如阶乘);

      2) 基于语义(难!);请看下面这个狗血的问题:

      5.Hanoi塔问题。

      可以概述为下面的描述:

    具体代码如下:

    输入3个时是这样的:

     需要多久呢?n个盘子需要移动2^64-1次,假设一秒一次,需要多久呢?

    ——————答案是约600亿年!

    哈哈,等你移完了,世界末日就到了~~~~可是计算机却帮我们实现了这一功能~~真心感到计算机的强大~~~~

      

    以上,请批评指正。
  • 相关阅读:
    Python多进程multiprocessing
    Python正则表达式基础
    wget: unable to resolve host address “http”
    python爬虫--爬取cctv连续剧
    Linux 配置静态IP
    ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'localhost'
    启动hive --service metastore &出现Missing Hive Execution Jar: /opt/apache-hive-1.2.0-bin//lib/hive-exec-*.jar
    /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15"" not found
    Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
    爬取豆瓣电影信息保存到Excel
  • 原文地址:https://www.cnblogs.com/duye/p/6075712.html
Copyright © 2011-2022 走看看