Lecture1 笔记

递归

把大问题分解为多个相似的小问题.

电影院问题: 获取人数, 如何获取?

1
2
3
函数 获取人数:
如果 前面没人 返回1
否则 问前面的人 前面有几个人 返回这个数+1

汉诺塔问题:

定义一个函数, 移动n个饼. 如果n=1, 直接移动即可. 如果n!=1, 那么对于上面的n-1个饼, 最下面的饼 并不会影响上面n-1个饼的移动. 所以, 可以递归调用此函数, 移动n-1个饼.

1
2
3
4
5
6
7
8
9
定义函数 移动饼(从哪儿,到哪儿,借助哪儿,饼数量):
如果 饼数量 == 1
那么 把这个饼从"从哪儿"移动到"到哪儿"
否则
把 n - 1 个饼 从"从哪儿"移动到"借助哪儿"
这个时候"从哪儿"这根柱子上的最后一个饼可以直接移动到"到哪儿".
所以这时候, 移动第n个饼从"从哪儿"移动到"到哪儿"
然后移动 n - 1 个饼从"借助哪儿""到哪儿"
这个时候就完成了移动n个饼.

放苹果问题:

定义一个函数用于解决"n个苹果放到m个盘子里"问题.

那么这个问题, 可以分解为以下两种子情况:

  1. 每一个盘子内都放一个苹果
  2. 接下来不再对某个盘子放苹果
1
2
3
4
5
6
7
8
定义函数 放苹果(苹果数, 盘子数):
如果 苹果数 == 0 或者 盘子数 == 1
返回1
如果苹果数小于盘子数:
// 肯定至少有盘子数-苹果数个盘子空着
返回 放苹果(苹果数, 苹果数)
返回 放苹果(苹果数-盘子数, 盘子数) // 每一个盘子内都放一个苹果
+ 放苹果(苹果数, 盘子-1) // 接下来不再对某个盘子放苹果

括号匹配问题:

给出一个括号序列, 判断是否是匹配的括号序列.

先读入字符串, 每次处理一个字符. 如果是左括号, 就入栈. 如果是右括号, 首先判断栈中是否有元素(s.size() > 0), 如果有元素再判断栈顶元素是否是当前右括号对应的左括号. 如果是, 就把左括号出栈. 如果不是, 说明这个括号序列并不美观.