递推

# 递推

  1. 上楼梯 小明上楼梯可以一次上一阶、两阶、三阶。求小明上n阶楼梯有多少种走法。 f(n) = f(n-1) + f(n-2) + f(n-3) 递归的方式
	private int countStair(int n) {
		if (n == 1){ return 1; }
		if (n == 2){ return 2; }
		if (n == 3){ return 4; }
		return countStair(n-1) + countStair(n-2) + countStair(n-3);
	}
1
2
3
4
5
6

循环

	private int countStair2(int n){
		if (n == 1){ return 1; }
		if (n == 2){ return 2; }
		if (n == 3){ return 4; }
		int x = 1,y = 2,z=4;
		int sum = 0;
		int i = 4;
		while(i<=n){
			sum = x+y+z;
			x = y;
			y=z;
			z=sum;
			i++;
		}
		return sum;
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

递归调用会开辟栈空间,而且对于多分支可能存在重复的计算。

  1. 机器人走方格 一个x*y的网格,一个机器人智能走格点且智能向右或向下走,要从左上角走到右下角,问有多少种走法。 f(x,y) = f(x-1,y)+f(x,y-1)

递归比较简单,下面给出循环解法

	@Test
	public void t_机器人走方格() {
		int x= 4,y=4;
		int a[][] = new int[y][x];
		for (int i = 0; i < x; i++) {
			a[0][i] = 1;
		}
		for (int i = 0; i < y; i++) {
			a[i][0] = 1;
		}
		for (int i = 1; i < y; i++) {
			for (int j = 1; j < x; j++) {
				a[i][j] = a[i-1][j] + a[i][j-1];
			}
		}
		System.out.println(a[y-1][x-1]);
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 子集

增量构造法 二进制法

# 全排列

集合法 遍历元素,将元素加入左中右组成新串 需要开辟新空间 交换法 将剩余元素与子串头部交换,依次确定头部元素,需要回溯恢复字符串数组。 原址,但是没法保证生成的顺序 前缀法 依次将可用元素追加到子串尾部 可保证生成顺序

# 封闭形式直接解

汉诺塔 f(n) = 2f(n-1)-1 = 2^n-1

上次更新: 2023/04/09, 16:34:32
最近更新
01
go-admin-ui项目仿写练手1-登录页
06-29
02
maven依赖问题
06-17
03
JVM相关命令
02-21
更多文章>