• 首页>范文 > 范文
  • 怎么写递归

    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.什么是递归函数

    递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。

    当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。

    所以递归要有两个要素,结束条件与递推关系。

    递归有两个基本要素:

    (1)边界条件:确定递归到何时终止,也称为递归出口。

    (2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

    在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

    一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

    (1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;

    (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;

    (3)每次递归调用结束后,将栈顶元

    扩展资料:

    递归就是某个函数直接或间接地调用了自身,这种调用方式叫做递归调用。说白了,还是函数调用。既然是函数调用,那么就有一个雷打不动的原则:所有被调用的函数都将创建一个副本,各自为调用者服务,而不受其他函数的影响。

    你的ff函数,递归多少次,就有多少个副本,再利用内存的栈式管理,反向退出。这个最好找一下“栈”这方面的东西看看,挺容易的,就像子弹匣一样,先进后出。

    从某种意义上说,这是不对的,因为就像刚才说的,一旦被调用,他将在内存中复制出一份代码,再被调用就再复制一份,换句话说,你可以吧同一个函数的多次调用理解称谓多个不同函数的一次调用,这样也会会简单些。

    再说=1和=0是为什么退出。递归,很需要注意的就是死递归,也就是说,某一个函数进入了无限调用自身的情况,永无止境地消耗内存等资源,这在编程方面是一大忌。

    但凡是递归的函数,一定会在某一个地方存在能够返回上一层函数的代码,否则必定死递归。ff函数中,那个else就是返回的出口,你可以这样想,如果没有那个if来进行判断,你递归到什么时候算完?ff是不是会一直调用自己。

    因为一旦某个函数A中调用了函数B(或者自己),那么A中的代码会停在调用的位置,而转向B中去执行,同理,如果B又调用函数C,那么B又停在调用的位置,去执行C,如果无限调用,那么程序是永远不会结束的。

    当然,也有这种情况,A调用B,然后继续自己的代码,不管B的死活,这种不在我们的讨论范围内,因为那牵扯到另一种编程方式:多线程。

    参考资料:搜狗百科——递归函数

    发表评论

    登录后才能评论