[18/11/22]递归(自己调用自己)
Posted id-qingxin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[18/11/22]递归(自己调用自己)相关的知识,希望对你有一定的参考价值。
1、用非递归计算10的阶乘
代码示例:
1 //用循环求10的阶乘 2 public class Test_1122_01 { 3 public static void main(String args[]){ 4 long d1=System.currentTimeMillis();//获取系统 以毫秒为单位的当前时间 5 int n=10,result=1; 6 while(n>1){ //核心代码 当n=10时 满足条件n>1,计算 result=1*10*9=90 然后n-2=8 满足n>1 计算 90*8*7的值 以此类推 , 7 result=result*n*(n-1);// 直到n=0时不满足条件,退出循环 8 n=n-2; 9 } 10 long d2=System.currentTimeMillis(); 11 System.out.println(d2-d1); //计算差值看运算花费了多少时间 结果为一般为0 说明很快 12 System.out.println("result="+result); 13 14 }
2、用递归计算10的阶乘
代码示例:
1 //用递归计算10的阶乘 2 public class Test_1122_02 3 { 4 public static void main(String[] args) 5 { 6 long d1=System.currentTimeMillis();//获取时间 7 System.out.println("result= "+fun(10));//开始调用方法 fun() 8 long d2=System.currentTimeMillis(); 9 System.out.println(d2-d1); //输出结果会比循环大一点 10 11 } 12 13 static int fun(int n){ 14 if(n==1){ //递归头,从这里结束,没有头将会陷入死循环 15 return 1; 16 }else{ //递归体,从这里调用 17 return n*fun(n-1); //相当于10*fun(9)=10*9*fun(8)=.......10*9*......2*fun(1)【此时fun(9)、fun(8)、..尚未计算完成】 18 } //由于fun(1)=1,逆序倒过去,fun(2)=2*fun(1)=2*1=2 fun(3)=3*fun(2)=3*2=6,以此类推 19 } // 【fun(2),fun(3)....fun(9)依次计算完成】,返回结果 20 }
总结:
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排排序等问题。
递归调用会占用大量的系统堆栈,内存耗用多。
任何能用递归解决的问题也能使用迭代(循环)解决。
扩展:用递归求斐波那契数列
1 public class Test_1122_03 2 { 3 public static void main(String[] args) 4 { 5 int count=0; 6 for(int i=1;i<=20;i++){//输出前20个斐波那契数,左对齐,10个数换1行 7 System.out.printf("%-6d",fun(i)); 8 count++; 9 if(count%10==0) 10 System.out.println(); 11 } 12 } 13 14 static int fun(int n){ // 规律 | fun(1) fun(2) fun(3) fun(4) fun(5) .....fun(n) 15 if(n==1||n==2){ 16 return 1; //递归体出口 | 1 1 2 3 5 ..... fun(n-2)+fun(n-1) (n>=3) 17 }else{ 18 return fun(n-2)+fun(n-1); 19 20 } 21 } 22 }
以上是关于[18/11/22]递归(自己调用自己)的主要内容,如果未能解决你的问题,请参考以下文章