递归
把大问题分解为多个相似的小问题.
电影院问题:获取人数,如何获取?
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 3 4 5 6 7 8
| 定义函数 放苹果(苹果数, 盘子数): 如果 苹果数 == 0 或者 盘子数 == 1 返回1 如果苹果数小于盘子数: // 肯定至少有盘子数-苹果数个盘子空着 返回 放苹果(苹果数, 苹果数) 返回 放苹果(苹果数-盘子数, 盘子数) // 每一个盘子内都放一个苹果 + 放苹果(苹果数, 盘子-1) // 接下来不再对某个盘子放苹果
|
括号匹配问题:
给出一个括号序列,判断是否是匹配的括号序列.
先读入字符串,每次处理一个字符.如果是左括号,就入栈.如果是右括号,首先判断栈中是否有元素(s.size() > 0),如果有元素再判断栈顶元素是否是当前右括号对应的左括号.如果是,就把左括号出栈.如果不是,说明这个括号序列并不美观.