算法基础--第八章--暴力递归

-- 常见的递归问题
-- 几种常见的尝试类型

介绍递归和动态规划
暴力递归:
1,把问题转化为规模缩小了的同类问题的子问题
2,有明确的不需要继续进行递归的条件(base case)
3,有当得到了子问题的结果之后的决策过程

4,不记录每一个子问题的解


动态规划
1,从暴力递归中来
2,将每一个子问题的解记录下来,避免重复计算
3,把暴力递归的过程,抽象成了状态表达
4,并且存在化简状态表达,使其更加简洁的可能

 

1.

求n!的结果

 

2.

汉诺塔问题
打印n层汉诺塔从最左边移动到最右边的全部过程

算法基础--第八章--暴力递归

3.

打印一个字符串的全部子序列,包括空字符串

算法基础--第八章--暴力递归

4.

打印一个字符串的全部排列

进阶

打印一个字符串的全部排列,要求不要出现重复的排列

 

5.

母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设不会死。求N年后,母牛的数量。

F(n) = F(n-1) + F(n-3)

进阶
如果每只母牛只能活10年,求N年后,母牛的数量。

 

6.

给你一个栈,请你逆序这个栈,不能申请额外的数据结构,只能使用递归函数。如何实现?

 

7.

给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累
加起来。返回最小的路径和。

  算法基础--第八章--暴力递归

f(1,1)重复解产生,暴力递归不行,

什么暴力递归可以改动态规划:重复状态,与到达 路径无关(可变参数固定,返回值固定)

8

给你一个数组arr,和一个整数aim。如果可以任意选择arr中的数字,能不能累加得到aim,返回true或者false

算法基础--第八章--暴力递归

9

给定两个数组w和v,两个数组长度相等,w[i]表示第i件商品的重量,v[i]表示第i件商品的价值。再给定一个整数bag,要求你挑选商品的重量加起来一定不能超过bag,返回满足这个条件下,你能获得的最大价值。