递归算法有如下3 个特点:
(1) 递归过程一般通过函数或子过程来实现。(2) 递归算法在函数或了过程的内部,直接或者者间接地调用自己的算法。
(3) 递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解。
在使用递归算法时应该注意如下4 点:
(1) 递归是在过程或函数中调用自身的过程。(2) 在使用递步策略时,必须有一个明确的递归结束条件,被称为递归出口。
(3) 递归算法通常显得很简洁,但是运行效率较低,所以一般不提倡用递归算法设计
程 序。
4)在通过调用过程中,系统用栈来储存每一层的返回点和局部量。如果递归次数过多,则容易造成栈溢出,所以一般不提倡用递归算法设计程序。
汉诺塔问题
学校里有3个柱子,第一个有64个盘子,从上往下盘子越来越大。老师要求学生Al把这64个盘子全部移动到第3个柱子上。移动的时候始终只能小盘子压着大盘子,而且每次只能移动一个。
#include<stdio.h>
void move(int n,int x,int y,int z)
{
if(n==1){
printf("%c-->%c\n",x,z);
}
else{
move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
{getchar();}
move(n-1,y,x,z);
}
}
void main()
{
int h;
printf("input number:");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
阶乘问题
阶乘是(factorial)是基斯顿*卡曼(Christian Kramp,1760~1826)于1808年发明的运算符号。阶乘也是数学里的一种术语,指1乘以2乘以3乘以4持续乘以到所要求的数。
例如所要求的数是n,则阶乘式是1*2*3*.....n,得到的积是x,即x就是n得阶乘
#include<stdio.h>
int fact(int n)
{
if(n<=1){
return 1;
}
else{
return n*fact(n-1);
}
}
void main()
{
int i;
printf("请输入要求阶乘得一个整数:");
scanf("%d",&i);
printf("%d得阶乘结果为:%d\n",i,fact(i));
}