?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
解释Q程序调用自w的~程技巧叫做递归?/span>
E序调用自n的编E技巧称为递归Q?recursionQ。递归做ؓ一U算法在E序设计语言中广泛应用?一个过E或函数在其定义或说明中有直接或间接调用自n的一U方法,它通常把一个大型复杂的问题层层转化Z个与原问题相似的规模较小的问题来求解Q递归{略只需量的程序就可描q出解题q程所需要的多次重复计算Q大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合?/span>
递归的三个条Ӟ
边界条g
递归前进D?/strong>
递归q回D?/strong>
当边界条件不满Ӟ递归前进Q当边界条g满Ӟ递归q回?/strong>
下面通过两个CZE序来说明:
使用Java代码?的阶乘。(5的阶?5*4*3*2*1Q?/span>
[java]
package org.wxp.recursion;
/**
* 计算5的阶?result = 5*4*3*2*1)
* @author Champion.Wong
*
*
*/
public class Test01 {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n) {
if (1 == n)
return 1;
else
return n*(n-1);
}
}
此题中,按照递归的三个条件来分析Q?/span>
(1)边界条gQ阶乘,乘到最后一个数Q即1的时候,q回1Q程序执行到底;
(2)递归前进D:当前的参C{于1的时候,l箋调用自nQ?/span>
(3)递归q回D:从最大的数开始乘Q如果当前参数是5Q那么就?*4Q即5*(5-1)Q即n*(n-1)
使用Java代码求数列:1Q?Q?Q?Q?Q?......W?0位的?/span>
[java]
package org.wxp.recursion;
/**
* 求数列:1Q?Q?Q?Q?Q?......W?0位的?nbsp;
* @author Champion.Wong
*
*/
public class Test_02_Fibonacci {
public static void main(String[] args) {
System.out.println(f(6));
}
public static int f(int n ) {
if (1== n || 2 == n)
return 1;
else
return f(n-1) + f(n-2);
}
}
心得Q有些初学者可能认为递归x自己调用自己Q那岂不是死循环了。对Q如果递归写的不合理,那就是死循环了。但是如果写的合理,加上“边界条件”,E序执行到底的时候,会逐层q回。就像我们爬׃P我们l着p\爬上一层又一层,如果没有山顶Q我们会一直往上爬。但如果C山顶Q就按照上山时候的步骤一层一层的往下爬?/strong>