递归怎么写
1.如何写递归函数
一句话搞掂.
如果一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的,那么这个函数就是递归函数.理解了我这句话,递归算法的应用就不是问题了.
写递归函数第一步是分析问题,分析问题是否存在"一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的"这种关系,如果存在,使用递归函数必定是成功的,因为它就是递归函数的定义的阐发.
看我分析最经典的汉诺塔问题:
将n个盘从第1个柱子移到第3个柱子需要三步完成,换句话说,这个移盘函数---用f来表示,它由三步完成.
1. 将n-1个盘从第1个柱子移到第2个柱子.
2. 将1个盘从第1个柱子移到第3个柱子
3. 将n-1个盘从第2个柱子移到第3个柱子.
关键的地方到了,如果一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的,
看第1个步骤,将n-1个盘从第1个柱子移到第2个柱子,我们暂时用g来表示,等下你会发现f=g的.
这个步骤也是由3个步骤来完成的:
1.将n-2个盘从第1个柱子移到第3个柱子.
2.将1个盘从第1个柱子移到第2个柱子
3.将n-2个盘从第3个柱子移到第2个柱子.
首先"将n-1个盘从第1个柱子移到第2个柱子" 是 "将n个盘从第1个柱子移到第3个柱子" 的一个步骤.
其次"将n-1个盘从第1个柱子移到第2个柱子" 这个步骤 包含的步骤 是和 "将n个盘从第1个柱子移到第3个柱子"这个函数的步骤是一致的(都是三步),只是柱子的位置不同而已,这里的位置和函数的参数是等价的,因此,位置不同,就是函数参数值不同而已,函数的参数个数就等价于柱子的个数.换句话说,f和g的步骤和参数是一致的,只是实参不同而已,因此f=g的.这里面涉及到一点抽象思维,只能靠自己去理解了.
因此,如果用f(n,a,b,c)表示将n个盘从第1个柱子移到第3个柱子的话,那么,将n-1个盘从第1个柱子移到第2个柱子,就可以用f(n-1,a,c,b)表示了,为什么?因为上述已经分析过了,步骤是一致的,参数的个数是一致的,只是参数的值不同而已.
我总结了一个最快完成递归函数的方法,做一道题大概5分钟左右.
1. 当n时,需要的步骤,列出来
2. 当n-1时,需要的步骤,列出来.
比较上述两者的共性:1.步骤是一致的,2.参数的个数是一致的
如果满足上述两者,就将n-1的步骤就n的步骤代替,这样就ok了.
2.c语言递归排序怎么写、
#include<stdio.h>
void main(){
int a,b;
printf(“请输入所求阶乘的数a:n");
scanf("%d",&a);
fun(&a);
printf("所得a的阶乘为:n”);
int fun(int a){
int a;
if(a==0)
a=1;
esle
a=fun(n)*fun(n-1);
return a;
}
}
试一下吧,生疏了
3.用c语言的递归怎么来写选择排序
选择排序的递归算法
#include
select(int a[8],int m,int n)
{
int i,t,k;
k=m;
for(i=m+1;iif(a[k]>a[i])
k=i;
if(k!=m)
{
t=a[k];
a[k]=a[m];
a[m]=t;
}
if(mselect(a,m+1,n);
}
main()
{
int a[10]={46,55,13,42,94,17,05,70};
int i;
select(a,0,8);
for(i=0;iprintf("%4d",a[i]);
printf("n");
}
4.递归程序如何写,要满足三个条件,切记
以 C 语言为例,举一个最最经典的例子就是:计算一个整数的阶乘。
#include
int my_jiecheng( int ) ;
int main( )
{
int num, result = 0 ;
scanf("%d", &num) ;
result = my_jiecheng(num) ;
printf("result = %dn", result ) ;
return 0 ;
}
int my_jiecheng( n )
{
if( n == 1 )
return (1) ;
else
return( n * my_jiecheng(n-1) ) ;
}
