java递归的一个问题
据说比达格斯理论家,又称一群在必达格斯领导下工作的古希腊数学家,发现在数字序列
1,3,6,10,15,21 中有奇怪的联系
这个数列中第n项由第n-1项加n得到的。
效率问题
调用一个方法会有一定的额外开销。控制必须从这个调用的位子转移到这个方法的开始处。除次之外,传给这个方法的参数以及
这个方法返回的地址都要黑压入到一个内部的栈中。为的是这个方法可以访问参数值。知道返回到哪里去。
就这个问题来说,因为上述开销造成的结构,可能while方法执行速度比递归快。在此题中,递归的
代价是不大的。但是如果由于递归的存在,造成了太大规模的方法调用外,科恩能够会考虑消除递归。
另外一个低效率在系统内存空间存储所有的中间参数以及返回值,如果有大量的数据需要存储,这就会引起栈溢出了
人们常常采用递归,是因为它从概念上简化了问题,而不是因为它本质上更加有效。
?
?
package endual;public class TriangleQuestion {/** * 使用循环来求这个问题 * @param n * @return */public static int compute(int n) {int result = 0 ;for (int i=1; i<=n; i++) {result = result + i ;}return result ;}/** * 使用递归来求解这个问题 * @param n * @return */public static int computeDiGui(int n) {int rs = 0 ;if (n>=1) { rs =n + TriangleQuestion.computeDiGui(n-1);} return rs ;}/** * 使用递归来求解这个问题 * @param n * @return */public static int computeDiGui2(int n) { if(n==1) { return 1 ; } return n + TriangleQuestion.computeDiGui(n-1);} // end}
?
?
?
?
测试类
package endual;public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub int res = TriangleQuestion.computeDiGui(4) ; System.out.println(res);}}
?