性质
- 调用本身(入栈)
- 问题规模缩小
- 遇到终止条件跳出(出栈)
- 受现实问题限制,如栈的大小不够而失败.支持递归的语言必须支持「栈」结构
应用
阶乘
#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();
}