性質
- 調用本身(入棧)
- 問題規模縮小
- 遇到終止條件跳出(出棧)
- 受現實問題限制,如棧的大小不夠而失敗.支持遞歸的語言必須支持「棧」結構
應用
階乘
#include<stdio.h>
long factorial( int n ){
return n==0||n==1 ? 1 : n * factorial(n-1);
}
void main(){
long iResult = factorial(5);
printf("5的階乘爲:%ld",iResult);
getchar();
}
斐波那契數列
#include<stdio.h>
long fibo( int n ){
return n==0||n==1 ? 1 : fibo(n-1) + fibo(n-2);
}
void main(){
long iResult = fibo(5);
printf("斐波那契數列的第5項爲:%ld",iResult);
getchar();
}
漢諾塔
#include<stdio.h>
void move(char x, int n, char z){
printf("把圓盤 %d 從柱子 %c 移動到 %c 上\n",n,x,z);
}
void hanoi(int n, char x, char y, char z){
if(n==1)
move(x,1,z);
else
{
hanoi(n-1, x, z, y); //把1~n-1個圓盤 從x移動到y
move(x, n, z); //第n個圓盤 從x移動到z
hanoi(n-1, y, x, z); //把1~n-1個圓盤 從y移動到z
}
}
void main(){
printf("只有兩個圓盤時:\n");
hanoi(2,'X', 'Y', 'Z');
printf("\n三個圓盤時:\n");
hanoi(3,'X', 'Y', 'Z');
getchar();
}
楊輝三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
- 邊界爲1,內部爲爲上一行的兩個元素和
- 假設f(row , col)表示第row行,第col列的元素
- f(row , col) = 1 (col ==1 || row ==col),遞歸的終止條件
- f(row , col) = f(row-1 , col-1) + f(row-1 , col),上一行的兩個元素和
#include<stdio.h>
int getElem(int row, int col){
if( col==1 || row==col)
return 1;
else
return getElem(row-1,col-1) + getElem(row-1,col);
}
void pascal_triangle(int n){
int row,col;
for(row=1; row<=n; ++row){
for(col=1; col<=row; ++col)
printf("%d\t",getElem(row,col));
printf("\n");
}
}
void main(){
pascal_triangle(5);
getchar();
}