遞歸方法思想

遞歸算法基礎(chǔ)

在計算機(jī)編程應(yīng)用中,遞歸算法對解決大多數(shù)問題都是十分有效的,主要是因?yàn)樗軌蚴顾惴ǖ拿枋鲎兊煤啙嵑鸵子诶斫?,主要?個特點(diǎn)。

  • 遞歸過程一般通過函數(shù)或子過程來實(shí)現(xiàn)
  • 遞歸算法在函數(shù)或子過程的內(nèi)部,直接或間接地調(diào)用自己的算法。
  • 遞歸算法實(shí)際上是把問題轉(zhuǎn)化成規(guī)??s小了的同類問題的子問題,然后再遞歸調(diào)用函數(shù)或過程來表示問題的解。

使用遞歸算法時,應(yīng)該注意以下4點(diǎn):

  • 遞歸是在過程或者函數(shù)中調(diào)用自身的過程
  • 在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱之為遞歸出口
  • 遞歸算法通常顯得很簡潔,但是運(yùn)行效率較低,所以一般不提倡使用
  • 在遞歸調(diào)用過程中,系統(tǒng)通過棧來存儲每一層的返回點(diǎn)和局部量。如果遞歸次數(shù)過多,很容易造成棧溢出(StackOverflowError)

例如:

public class stack {
    private static int index = 1;
    public static void main(String[] args) {
        try {
            test();
        } catch (StackOverflowError e) {
            System.out.println(index);
            e.printStackTrace();
        }
    }
    public static void test() {
        index++;
        test();
    }
}

通過遞歸不斷地去調(diào)用自身,超過系統(tǒng)的棧的深度就會直接報錯


接下來通過漢諾塔的例子具體講解一下遞歸過程
首先什么是漢諾塔呢?
在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創(chuàng)造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預(yù)言,當(dāng)所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸于盡。
okay,我們的目標(biāo)是要把第一個柱子上的64片移到第三個柱子上面去

  • 首先第一輪可以把前63片移到第二個柱子上面去,再把第64片移到第三個柱子上面去,再把第二個柱子上面的63片移到第三個柱子上面
  • 那么,第二輪的問題是怎么把前63片移到第二個柱子,可以先把前62片移到第三個柱子上面去,再把第63片移到第二個柱子上面去,再把第三個柱子上面的62片移到第二個柱子上面
  • .......
  • 到了最上面一片只需要將第一片移開,把第二片移到另一個空柱子,再把第一片移到第二片上面去,完成整個操作(第一片移到哪個柱子取決于你的片數(shù)的奇偶)

這樣就形成了遞歸,在你調(diào)用move(n,a,b,c)的時候,只需要讓n-1個片移到b上面去(move(n-1,a,c,b)),再把第n個片移到c,緊接著把b上面的n-1個片移到c上面去(move(n-1,b,a,c)),就可以完成整個操作。
從結(jié)果上面來看,需要搬移的次數(shù)為2^n - 1

public class HanoiTest {
    private static int count;
    public static void main(String[] args) {
        move(64,'a','b','c');
        System.out.println(count);
    }
    private static  void move(int n,int a,int b,int c) {
        if (n == 1) {
            count++;
            System.out.println((char)a +"-->"+ (char)c);
        } else {
            move(n-1,a,c,b);
            count++;
            System.out.println((char)a +"-->"+ (char)c);
            move(n-1,b,a,c);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,637評論 1 32
  • 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大獎:點(diǎn)擊這里領(lǐng)取 在...
    HetfieldJoe閱讀 1,883評論 0 14
  • 計算機(jī)科學(xué)的新學(xué)生通常難以理解遞歸程序設(shè)計的概念。遞歸思想之所以困難,原因在于它非常像是循環(huán)推理(circular...
    啟明_b56f閱讀 7,666評論 0 20
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,507評論 0 13
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,813評論 0 3

友情鏈接更多精彩內(nèi)容