java数据结构和算法基础——递归介绍

本文探讨了递归方法的基本原理及其实现方式,包括基准情形和不断推进的原则,并对比了递归与循环的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 递归方法的讨论

        首先,我们来看一个简单的数学函数:f(x)=2f(x-1)+x^2,其中:f(0)=0

        从上面的定义中,我们可以很清晰的推论出:f(1)=1,f(2)=6,f(3)=21,以及f(4)=58

        那么,我们如何使用一个简单的java函数来描述这个公式,并根据这个公式拿到正确的解析结果呢?我们直接上代码:

  /**
     *
     * 功能描述: 描述 f(x)=2f(x-1)+x^2 其中:f(0) = 0;
     *
     * @param:
     * @return:
     * @auther: CYL
     * @date: 2018/9/13 10:36
     */
    public static int f(int x){
        if(x == 0) return 0;
        else return 2*f(x-1)+x*x;
    }

        这里我们需要明确的是,java提供的仅仅是对递归思想的一种尝试,不是所有的数学递归函数都可以被有效的使用java代码来实现。上面代码中if(x == 0 ) 处理的是一个基准情况,即如果满足这个条件,就可以直接返回数据,而不需要执行递归函数,正如上面f(x)=2f(x-1)+x^2 中若是没有f(0)=0这个条件,其在数学意义上是没有意义的,没有办法计算出任何的一个函数值,同样,java中递归方法失去了基准情况也是没有任何意义的。

       跟踪挂起的函数调用(这些调用已经开始,但是正在等待递归调用来完成)以及他们的变量记录都是由计算机来完成的。然而重要的问题是,递归调用将反复进行,直到基准情况的出现。例如在上面的递归中,我们想获取f(-1)的值,那么势必会调用f(-2)的值,以此类推,我们永远不可能拿到f(-1)的值,甚至在特殊的情况下,甚至会发生更加微妙的事情:

  /**
     *
     * 功能描述: 描述 f(x)=f(x/3+1)+x^2 其中:f(0) = 0;
     *
     * @param:
     * @return:
     * @auther: CYL
     * @date: 2018/9/13 10:36
     */
    public static int bad(int x){
        if(x == 0) return 0;
        else return bad(x/3+1)+x*x;
    }

        这里我们想获取bad(1)的结果,但是这个定义其实是给不出任何的结果的,计算机将会反复调用bad(1)以期解出他的值,最后,计算机的内存空间将被消耗殆尽,导致系统崩溃

       经过上面的讨论,我们可以得出两个结论:

       基准情形:必须总要有一些基本的情形,使得递归方法在不使用递归的情况下可以直接拿到对应的值

       不断推进:递归的调用应当总是想着基准情形推进

       其中还有其他的两个原则是我们必须考虑到的:

       设计法则:假设所有的递归调用都能完成

       合成效益法则:的在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作

递归和循环

        这里我们需要明白的是在递归调用中,我们调用的是方法的本身,但是我们并没有使用方法本身定义该方法的一个特定的实例,换句通俗的话讲,通过使用f(5)得到f(5)的值才是循环,通过使用f(4)得到f(5)的值不能称之为循环

 

Java基础系列课程 ppt 源码 Java数据结构算法第七讲.avi Java数据结构算法第三十一讲.avi Java数据结构算法第三十七讲.avi Java数据结构算法第三十三讲.avi Java数据结构算法第三十九讲.avi Java数据结构算法第三十二讲.avi Java数据结构算法第三十五讲.avi Java数据结构算法第三十八讲.avi Java数据结构算法第三十六讲.avi Java数据结构算法第三十四讲.avi Java数据结构算法第三十讲.avi Java数据结构算法第九讲.avi Java数据结构算法第二十一讲.avi Java数据结构算法第二十七讲.avi Java数据结构算法第二十三讲.avi Java数据结构算法第二十九讲.avi Java数据结构算法第二十二讲.avi Java数据结构算法第二十五讲.avi Java数据结构算法第二十八讲.avi Java数据结构算法第二十六讲.avi Java数据结构算法第二十四讲.avi Java数据结构算法第二十讲.avi Java数据结构算法第八讲.avi Java数据结构算法第六讲.avi Java数据结构算法第十一讲.avi Java数据结构算法第十七讲.avi Java数据结构算法第十三讲.avi Java数据结构算法第十九讲.avi Java数据结构算法第十二讲.avi Java数据结构算法第十五讲.avi Java数据结构算法第十八讲.avi Java数据结构算法第十六讲.avi Java数据结构算法第十四讲.avi Java数据结构算法第十讲.avi Java数据结构算法第四十一讲.avi Java数据结构算法第四十三讲.avi Java数据结构算法第四十二讲.avi Java数据结构算法第四十四讲.avi Java数据结构算法第四十讲.avi 第一讲.exe 第三讲.exe 第二讲.exe 第五讲.exe 第四讲.exe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值