问题:
一个机器人从最左角,只能向下或向右走,每次走一步,走到最右角,有多少种走法?
递归解法:找规律:
当你向右走时,列数减一。当你向下走时,行数减一。总的路径走法:两者相加
当只有一行或者一列,只有一种走法
非递归解法:
即state[i][j] = state[i-1][j]+state[i][j-1]
代码:
package Recursion;
/*
* 两种方式:递归和迭代,迭代利用二维数组
* f(x,y)=f(x-1,y)+ f(x,y-1)
* */
public class 机器人走格子 {
//递归
public static int jiqiren(int x,int y){
//当只有一行或者只有一列的时候,只有一种走法,递归的出口
if(x==1||y==1) return 1;
return jiqiren(x-1,y)+jiqiren(x,y-1);
}
//迭代
public static int jiqiren1(int m,int n){
int[][] state=new int[m+1][n+1]; //定义一个二维数组,从1,1开始,0,0的不要了 m代表行,n代表列
for (int i = 1; i <=n ; i++) {
state[1][i]=1; //初始化只有一行的时候只有一种走法
}
for (int i = 1; i <=m ; i++) {
state[i][1]=1; //初始化只有一列的时候只有一种走法
}
//注意:i,j开始的起点坐标是(2,2)
for (int i = 2; i <=m ; i++) {
for (int j = 2; j <=n ; j++) {
state[i][j]=state[i-1][j]+state[i][j-1]; //f(x,y)=f(x-1,y)+ f(x,y-1)
}
}
return state[m][n];
}
public static void main(String[] args) {
int sum = jiqiren1(3, 3);
System.out.println(sum);
}
}