c++遞歸函數


一、什么是遞歸算法

   遞歸即遞推+回歸。遞歸算法是把問題轉化為規模縮小了的同類子問題,然后遞歸調用函數(或過程)來表示問題的解。

、遞歸算法的特點

  1.必須有 遞歸函數 遞歸出口

  2.遞歸算法解題通常顯得簡潔,但效率較低且系統通過棧來儲存每一層的返回點、局部變量,遞歸次數過多容易造成棧溢出

三、如何編寫遞歸函數

  例:Hanoi 塔(問題內容不再贅述)

    我們以三個圓盤(從小到大依次成為1,2,3號)三根柱子(A,B,C)為例: 

     

  

    想要將 3號 移至C柱

       step1.  借助C把1、2號盤移到B;      

       step2.  將3號盤移至C;  

    

 

 

 

 

     想要將 2號  移至 C 柱 則用上述同樣的思想     (遞歸函數的內涵所在,將大問題逐個分解為相同小問題)

         step1. 借助C 將 1號盤 移至 A柱 /*這里可以直接將 1號盤移至A,但如果 B盤上不止一個盤則需要借助C ,我這里是 按整體規律來寫*/

              step2.  將 2號盤 移至 C;

    

 

 

    

 

    最后將 1號盤 移至 C柱

    

 

 

Hanoi塔 解題步驟:

1.將 A 上 n-1 個盤子移到B (借助C)

2.把 A 上 剩下的盤子移到C 

3.將 n-1 個盤子從B 移到 C (借助A)

 

 

!!!

不用死記A B C在各個盤移動時的站位,將他們想成

初始柱  過渡柱  目標柱  這樣在敲代碼時思路會清晰一些

 

代碼實踐:

#include<iostream>
using namespace std;

void move(char x1, char x2) {
    cout << x1 << "-->" << x2 << endl;
}


//A、B、C三個位置依次對應 初始柱/ 過渡柱/ 目標柱【是對應的位置對應各種柱子(初始、過渡、目標柱) 不是ABC字母對應】 void hanoi(int n, char A, char B, char C) {        

    if (n == 1)
        move(A, C);
    else {
        hanoi(n - 1, A, C, B);        //A為初始柱 C為過渡柱 B為目標柱
        move(A, C);
        hanoi(n - 1, B, A, C);        //B為初始柱 A為過渡柱 C為目標柱
    }
}

int main() {
    cout << "輸入盤子數: ";
    int p;
    cin >> p;
    char A = 'A', B = 'B', C = 'C';
    hanoi(p, A, B, C);
    return 0;
}

----------------------------------------------------小分割線----------------------------------------------

注意遞歸算法的兩個必要條件遞歸出口和遞歸函數

認真分析如何將大問題分解為子問題    

 這些需要多加練習~

==============================大分割線=========================

如有錯誤還是希望評論指正 :)

 

 

    


免責聲明!

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



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