【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億年!

 

哈哈,等你移完了,世界末日就到了~~~~可是計算機卻幫我們實現了這一功能~~真心感到計算機的強大~~~~

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM