递归思想的原理与应用 Recursion

1,什么是递归?

         函数自己调用自己本身
   
               method(){
                  method();
         }
     
        或
     
         methodA{
        methodB();
         }
         methodB(){
         methodA();

         }


 2,递归的作用

    将一个复杂的问题分解成几个相同的简单问题


3,递归与循环的区别

   递归需要出口

   在进行循环时,每当一次循环结束,循环的结果作为下次循环的初始值,而上次循环占用的内存就会被系统释放。因此循环可以没有出口而不停无限循环下去。

   而在进行递归时,程序是按层次进行下去的。每次函数执行到调用自身时,都会进行下一层,而上次的函数是没有执行完毕的。因此,每一轮得到的值都会存在内存中而不被释放。就像检索一个文件时,要先从最上层开始,一层一层向下检索,在未检索到目的文件之前,上层打开的文件夹一直都不会关闭。

   因此,递归虽然相比于循环来说,递归算法的代码复杂度明显减小,但消耗的代价则是大量的内存。因此,当写一个递归程序时,必须添加出口,否则当内存被占满时就会报错。


 4,使用递归的两个条件:

    1),可以分解成几个情况相同的问题;
    2),必须有一个退出出口,否则就会因为内存被占用光而出现堆栈溢出


5,递归的两个部分:

    1),递推  —— 函数调用自己的部分
    2),回归  —— 函数中递推之外的部分


6,例子:

     1,1+2+....+n
       
//递归(累加1到n)
package Recursion;

public class Recursion {
	public static int add(int i){
		if(i == 0){
			return 0;
		}
		else{
			return add(i-1)+i;
		}
	}	
	public static void main(String[] args){
		int sum = add(10);
		System.out.println("sum = " + sum);
	}

}

   2,乘法表(循环)
package Recursion;

public class Multiplication {
	
	public static int multiplication(int m){
		for(int i = 1;i <= m;i++){
			for(int j = 1;j <= i;j++){
				System.out.print(j+"*"+i+"="+(i*j)+"  ");
				
			}
			System.out.println();
		}
		return m;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		multiplication(9);

	}

}

   3,乘法表(递归)
package Recursion;

public class Multi_Recursion {
	public static void multiplication(int m){
		if(m == 1){
			System.out.println("1*1=0");
		}
		else{
			multiplication(m - 1);
			for(int i = 1;i <= m;i++){
				System.out.print(i+"*"+m+"="+(i*m)+"  ");
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		multiplication(9);

	}

}

   4,斐波那契数列
package Recursion;

public class Fibonacci {
	public static void fi(int i,int j){
		if(j <= 200){
		    System.out.print(j+" ");
		    fi(j,i+j);
	
	   }
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		fi(1,1);

	}

}

   5,汉诺塔(递归)—— 将n个盘子从p1移动到p3
public class HanoTower {
	public static void move(int n,int t1,int t2,int t3){   //将n个盘子从t1移动到t3,t2辅助
		if(n == 1){
			System.out.println("将盘子从塔"+t1+"移动到塔"+t3);
		}
		else{
			move(n-1,t1,t3,t2);
			System.out.println("将盘子从塔"+t1+"移动到塔"+""+t3);
			move(n-1,t2,t1,t3);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		move(3,1,2,3);

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值