[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 }

猜你喜欢

转载自www.cnblogs.com/ID-qingxin/p/9998730.html
今日推荐