递推与递归

public class HelloWorld {
	public static void main(String[] args) {
	
	    
	}
	
	/**
	 *  机器人走格子
	 *  (x,y) 表示目标点,只能向右或者向下走
	 * 题目大意就是求(0,0)到(x,y)有多少种走法
	 * f(x,y)=f(x-1,y)+f(x,y-1);
	 */
	 // 递归版本
	 static int solve(int x,int y){
	     if(x==1||y==1) return 1;
	     
	     return solve(x-1,y)+solve(x,y-1);
	 }
	 // 迭代版
	 // m 表示行数,n 表示列数
	 static int solve1(int m,int n){
	     int[][] map = new int[m+1][n+1];
	     //将第二行全置1
	     for (int i=1;i<=n ;i++ ){
	         map[1][i] =1;
	     } 
	     // 将第二列全置1
	     for (int j=1;j<=m ;j++ ){
	         map[j][1] =1;
	     } 
	     //利用递推公式赋值
	     for (int i=2;i<=m ;i++ ){
	         for (int j=2;j<=n ;j++ ){
	             map[i][j] = map[i-1][j]+map[i][j-1];
	         } 
	     }
	     return map[m][n];
	     
	 }
	 
	 /**
	  *  硬币面值问题
	  *  给定 1 5 10 25  求 n 组合种数
	  * 
	  * 思路:递推无法解决,只能进行枚举,而枚举思路先从大面值开始取,
	  *     算出大面值可举次数,然后依次递归选取小面值
	  */
	  
	 static int countWays(int n){
	     if(n<=0) return 0;
	     //面值数组
	     int[] value ={1,5,10,25};
	     return countWaysCore(n,value,value.length-1);
	 } 
	 // cur 表示 所取面值数组下标
	 static int countWaysCore(int n,int[] coins,int cur){
	     if(cur ==0) return 1;
	     int result = 0;
	     int counts_cur = n/coins[cur];//n 在当前面值下可选择次数
	     for (int i=0;i<=counts_cur ;i++ ){
	         int last = n-i*coins[cur];
	         result = result + countWaysCore(last,coins,cur-1);
	     }
	     return result;
	 }
	 
	 
}
posted @ 2021-04-17 19:35  Realization  阅读(54)  评论(0编辑  收藏  举报