java递归函数的例子

2022-11-22 投稿:林钰婷 分享

(1) 递归执行过程

例子:求N!。

这是一个简单的"累乘"问题,用递归算法也能解决。

n! = n * (n - 1)! n > 1

0! = 1, 1! = 1 n = 0,1

因此,递归算法如下:

Java代码

fact(int n) {

if(n == 0 || n == 1)

return 1;

else

return n * fact(n - 1);

}

以n=3为例,看运行过程如下:

fact(3) ----- fact(2) ----- fact(1) ------ fact(2) -----fact(3)

------------------------------> ------------------------------>

递归 回溯

递归算法在运行中不断调用自身降低规模的过程,当规模降为1,即递归到fact(1)时,满足停止条件停止递归,开始回溯(返回调用算法)并计算,从fact(1)=1计算返回到fact(2);计算2*fact(1)=2返回到fact(3);计算3*fact(2)=6,结束递归。

算法的起始模块也是终止模块。

(2) 递归实现机制

每一次递归调用,都用一个特殊的数据结构"栈"记录当前算法的执行状态,特别地设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回。递归模块的形式参数是普通变量,每次递归调用得到的值都是不同的,他们也是由"栈"来存储。

(3) 递归调用的几种形式

一般递归调用有以下几种形式(其中a1、a2、b1、b2、k1、k2为常数)。

<1> 直接简单递归调用: f(n) {...a1 * f((n - k1) / b1); ...};

<2> 直接复杂递归调用: f(n) {...a1 * f((n - k1) / b1); a2 * f((n - k2) / b2); ...};

<3> 间接递归调用: f(n) {...a1 * f((n - k1) / b1); ...},

g(n) {...a2 * f((n - k2) / b2); ...}。

2. 递归算法效率分析方法

递归算法的分析方法比较多,最常用的便是迭代法。

迭代法的基本步骤是先将递归算法简化为对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和,再估计和的渐进阶。

<1> 例:n!

算法的递归方程为: T(n) = T(n - 1) O(1);

迭代展开: T(n) = T(n - 1) O(1)

= T(n - 2) O(1) O(1)

= T(n - 3) O(1) O(1) O(1)

= ......

= O(1) ... O(1) O(1) O(1)

= n * O(1)

= O(n)

这个例子的时间复杂性是线性的。

<2> 例:如下递归方程:

T(n) = 2T(n/2) 2, 且假设n=2的k次方。

T(n) = 2T(n/2) 2

= 2(2T(n/2*2) 2) 2

= 4T(n/2*2) 4 2

= 4(2T(n/2*2*2) 2) 4 2

= 2*2*2T(n/2*2*2) 8 4 2

= ...

= 2的(k-1)次方 * T(n/2的(i-1)次方) $(i:1~(k-1))2的i次方

= 2的(k-1)次方 (2的k次方) - 2

= (3/2) * (2的k次方) - 2

= (3/2) * n - 2

= O(n)

这个例子的时间复杂性也是线性的。

<3> 例:如下递归方程:

T(n) = 2T(n/2) O(n), 且假设n=2的k次方。

T(n) = 2T(n/2) O(n)

= 2T(n/4) 2O(n/2) O(n)

= ...

= O(n) O(n) ... O(n) O(n) O(n)

= k * O(n)

= O(k*n)

= O(nlog2n) //以2为底

一般地,当递归方程为T(n) = aT(n/c) O(n), T(n)的解为:

O(n) (a<c && c>1)

O(nlog2n) (a=c && c>1) //以2为底

O(nlogca) (a>c && c>1) //n的(logca)次方,以c为底

上面介绍的3种递归调用形式,比较常用的是第一种情况,第二种形式也有时出现,而第三种形式(间接递归调用)使用的较少,且算法分析

比较复杂。 下面举个第二种形式的递归调用例子。

<4> 递归方程为:T(n) = T(n/3) T(2n/3) n

为了更好的理解,先画出递归过程相应的递归树:

n --------> n

n/3 2n/3 --------> n

n/9 2n/9 2n/9 4n/9 --------> n

...... ...... ...... ....... ......

--------

总共O(nlogn)

累计递归树各层的非递归项的值,每一层和都等于n,从根到叶的最长路径是:

n --> (2/3)n --> (4/9)n --> (12/27)n --> ... --> 1

设最长路径为k,则应该有:

(2/3)的k次方 * n = 1

得到 k = log(2/3)n // 以(2/3)为底

于是 T(n) <= (K 1) * n = n (log(2/3)n 1)

即 T(n) = O(nlogn)

由此例子表明,对于第二种递归形式调用,借助于递归树,用迭代法进行算法分析是简单易行的。

#java递归函数的例子#相关文章

javaswing是框架吗

Swing 是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。Swing提供许多比AWT更好的屏幕显示元

0.2万人浏览 javaswingSwing

java做贪吃蛇需要用到哪些知识

把蛇身体的每一块看成一个对象(对象存储该块的坐标和相关信息),作为节点存储在线性链表中,再设置一个变量标志蛇的方向(通过按键可以改变)。一般人都是让每一个节点等于他指向的下一个节点,并让头节点改变位置

0.2万人浏览 java做贪吃蛇需要什么知识

怎么打开java编程界面

1、现在的很多编程工具都是写代码,编译运行在一个程序窗口里的;  2、那就是所谓的IDE(集成开发环境)。  3、安装了开发工具后,就有这样的一个程序,启动程序也就进入了编程界面。  例如java编程

0.2万人浏览 java怎么打开Java

java是什么意思网络用语

JAVA是SUN公司推出的新一代面向对象的程序设计语言,适合于互联网 应用程序开发,它的平台无关性让它荣登世界排名第一编程语言,目前在全世界开发语言中处于垄断地位。那么JAVA具体应用领域有哪些呢?J

0.2万人浏览 JavaJAVAJava是

java随机数种子是什么意思

计算机所产生的随机数是通过一串很长的序列数模拟随机数,故称为伪随机数,在实际应用这些随机数时,这些随机数一般都能具有真实随机数的所有概率性质和统计性质,因此可以产生许许多多的序列伪随机数,一个序列的第

0.2万人浏览 java随机数种子什么是种子

java串口通信详解

简单地说,1.传感器输出的电压信号,如果很弱,首先要放大,如果变化范围满足精度要求,可以不用放大。2.传感器电压信号连接单片机的ADC,编程采集AD信号量。3.采集的AD信号量以串行通信传送到PC机中

0.2万人浏览 javaJavaJava串口

java接口是为了弥补java单继承的缺点

Java里的接口编辑Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP

0.2万人浏览 javaJavajava的

java是什么语言

虽然JavaScript与Java有紧密的联系,但却是两个公司开发的不同的产品。Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是

0.2万人浏览 JavaJAVA什么语言