• 【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亿年!

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

      

    以上,请批评指正。
  • 相关阅读:
    delphi的dbgrid控件点击title排序
    在 Delphi 中使用微软全文翻译的小例子
    Google的搜索API的Delphi封装
    Delphi 自动检测U盘插入、拔出及获取U盘盘符!
    ERP开发准备
    Delphi中TStringList类常用属性方法详解
    JavaScript prototype详解
    TestNG 自动化测试入门教程--典型示例
    ucloud中的udisk错误“Read-only file system”修复指南
    websocket(二)--简单实现网页版群聊
  • 原文地址:https://www.cnblogs.com/duye/p/6075712.html
Copyright © 2020-2023  润新知