《遞迴思維及其實現》
1、概念:
·乙個過程或乙個函式,在其定義或者說明中有直接或間接地呼叫自身的一種思想方法。
2、遞迴條件:
·子問題和原始問題是相同的事情;
·不能無限制地呼叫,必須有個出口(邊界條件)。
3、如何設計遞迴演算法:
·確定遞迴公式;
·確定邊界條件。
4、遞迴一般用來解決:
·資料的遞迴定義;
·遞迴演算法的實現;
·資料結構形式按遞迴定義(比如二叉樹)。
5、遞迴演算法相對於常用的演算法(如for迴圈),執行效率低。若操作不當,很容易造成棧溢位等錯誤。所以在設計演算法的時候,盡量避免使用遞迴。除非沒有更好的演算法,或者只能使用遞迴的時候才使用。
6、經典例項:漢諾塔問題。(後面例3有**)
7、注意:
·一定要有乙個邊界條件;
·不要在遞迴函式裡面申請大塊記憶體(malloc)
遞迴模板:
遞迴:1.確定引數
2.確定引數的函式
3.確定簡單情況下的函式
4.確定複雜情況下的函式
******************************
模板:int f(引數)
漢諾塔:
引數n:盤子個數
設f(n):n個盤子總共需要移動的步數
簡單情況下的函式
f(n) = 1 n = 1;
複雜情況下的函式
f(n) = 2f(n-1)+1; //(n > 1)
例1:輸出1-100
/********
===使用for迴圈做簡單很多===
#include int main(void)
return 0;
}*********/
//使用遞迴演算法
#include void func(int n);
int main(void)
void func(int n)
printf("%d\n", n);
}/***可以這樣來理解:
void func(int n)
printf("%d\n", n);
} printf("%d\n", n);
}*****/
例2:輸入乙個整數,求1^2+2^2+3^2+……+n^2
#include int recursion(int n); //宣告
int main(void)
int recursion(int n) //遞迴函式的定義
}
例:3:《漢諾塔》有三根柱子a、b、c,有n個大小不一的圓盤,原始狀態,所有圓盤都在a柱上(上面圓盤必須必下面圓盤小),現在要求,將所有圓盤移動到c上,一次只能移動乙個,並且必須放在某一根之子上。找出移動次數最小的方案。
#include void func(int n, char from, char buf, char to);
int main(void)
;//定義三根柱子
printf("請輸入圓盤個數:\n");
scanf("%d", &n); //輸入有多少個盤
printf("最簡移動方案:\n");
func(n,'a', 'b', 'c');
return 0;
}//用n個盤,原始盤全在from上,要移動到to上,中間工具用buf作過渡
void func(int n, char from, char buf, char to)
else
}
例3:
C 遞迴實現漢諾塔
a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...
C 漢諾塔遞迴實現
程式背景 漢諾塔 tower of hanoi 又稱河內塔,問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之...
漢諾塔遞迴的c語言遞迴實現
include include using namespace std void move int n,char from,char rely,char to else int main 漢諾塔遞迴演算法思路如下 三個柱子 起點柱子 from,依賴柱子 rely,目標柱子 to 演算法流程 函式引數...