Java递归算法

上一篇 / 下一篇  2012-10-09 10:52:10 / 个人分类:Java

%P:l0H,J1[:Q*z+v0  递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。51Testing软件测试网a1d3aHe

8h9}6B,Fe3Nn }0  递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。

!\hK)o"b4t?051Testing软件测试网;B jQ9ZF DDk

  递归算法解决问题的特点:

.A+AiP d051Testing软件测试网q [e3_ [#nL

  1)递归就是方法里调用自身。51Testing软件测试网!Pc@`d%F}`

51Testing软件测试网ke)}\{

  2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。51Testing软件测试网tvFBU?]z

#fXF)c3D'K+P:t'mv0  3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

[sRtk`A1F1l051Testing软件测试网U2~%y jir!jmSb

  4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。51Testing软件测试网/G;XV(` eWG!Oj

e)|zqHWD H0  递归算法所体现的“重复”一般有三个要求:

E ` O`U i(w{0

kHvuc0  一是每次调用在规模上都有所缩小(通常是减半);51Testing软件测试网`ZP+L"lN5KT

Py|"E] p\&R0  二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);51Testing软件测试网$LvMY0@Na

51Testing软件测试网~x'Gj!e)K/|i[

  三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

d0C/en8NvK8O0

Cf0Q|cn#Tx} {0  为了理解递归算法,现举一个实例说明如下:

#Xw3Khl,w&b t051Testing软件测试网1n5U*WK|*M,FP

   问题描述:求解Fibonacci数列的第10个位置的值?(斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定 义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*))

Y.f0? u1?KV051Testing软件测试网E(PBlW/l

  程序清单:

zV z7c,B?'o:v(u0
/**51Testing软件测试网N?JFS2aj C
 *<p>Title:Java递归算法实例</p>51Testing软件测试网m J O*V.@N)s*s/I;v
 *<p>Description:利用递归算法求解Fibonacci数列第5个数的值</p>51Testing软件测试网;_8Y^?2kA
 *<p>Copyright:Copyright(c) 2012</p>
D3[(U1g5T'xiz-e0 *<p>Filename:Fibonacci.java</p>
0x)uOg0Ag L0 *@author王路情
)Z I7WR Ck1r5v8M(N_0 *@version1.0
/Z)_9D1\5_f4] OpY0r0 */51Testing软件测试网9jL @ o7k0t5EP9k ah!k
public class Fibonacci
A x"[#n \0{
O/I-o v(U3vE-v0 /**51Testing软件测试网U;o K{1W0cw['zdc
  *方法描述:求解Fibonacci数列的递归算法51Testing软件测试网'D.kB7ty8? w4M-y w
  *输入参数:int n51Testing软件测试网lgf}Hv9p{
  *返回类型:int
j+jJ5kB0_6sb0  */51Testing软件测试网!e]-XB9u_ |
 public static int fun(int n)51Testing软件测试网:S0y+L6_P]
 {
#y;C4vD6^2V3H4H}^8c0   if(1==n || 2==n)
V`%FEf9}8zb0   {
{j^\0Sh!?0    return 1;
^:Y#V4fftTe0   }
^~6G,J!] t0   else51Testing软件测试网6I_8u!u%d+d!Y'\6J/Mh
   {51Testing软件测试网6c1d5KyEOs+o+i
    return (fun(n-1) + fun(n-2));
#^ w-^IW&M ^V0   }
cS8RhpT'c0 }
4e yA9L2p4e {!b0 51Testing软件测试网7\Wgug'^@*]jN
 /**51Testing软件测试网 Kj*vO'n2` S7r?6d+\:Q
  *方法描述:主方法51Testing软件测试网`kw@ WC,R
  *输入参数:String[] args51Testing软件测试网)ix)_zj5~(M}
  *返回类型:void51Testing软件测试网/f'^5QMMP }J5h2va
  */51Testing软件测试网dPg#~$m3]"^
 public static void main(String[] args)51Testing软件测试网'c5VQ7}:^l`4t
 {51Testing软件测试网gX x3H&al9YI
  System.out.println(fun(10));
(JT2k0{r$B:SZ%Z0 }51Testing软件测试网!Hy T x9v*fX
}

C]?Yz cS0  运行结果如下所示:

!j%q.|zw+t7f0

Ex3RF)b?8WX"N0  5551Testing软件测试网%x0}$Is6Vq?+d

51Testing软件测试网(m5K S(o*G$d,D yO

  总结:51Testing软件测试网n%B"jegM

f(\^a-d_[9N\0  1)递归算法,简而言之,就是方法直接或间接地调用自身。

kLGq6i6F0

z jcIK]0  2)递归算法必须有一个明确的递归结束条件,即递归出口。

!Mb9N@-lUZ3a0

l K^e`Ma-p4q0  3)递归算法简洁明了,但是效率不高。51Testing软件测试网(sk:A7Q4{D:}J:m`


TAG:

 

评分:0

我来说两句

Open Toolbar