递归题目汇总
关于递归,我们需要关心的主要是以下三点:
- 整个递归的终止条件。
- 一级递归需要做什么?
- 应该返回给上一级的返回值是什么?
因此,也就有了我们解递归题的三部曲: - 找整个递归的终止条件:递归应该在什么时候结束?
- 找返回值:应该给上一级返回什么信息?
- 本级递归应该做什么:在这一级递归中,应该完成什么任务?
先上手一道今天看到的牛客网的题目,有点难度。不过没关系,后面有简单的,我会慢慢补充,今天太累了,先写一道题目。
题目描述
给出一个数字N,对于数字序列 1,2,3 … N。现在在其中插入“+”, “-”, " “,使得表达式的和为M。” "的含义是把相邻的两个数字组成一个数。例如:1 + 2 3 - 4,含义是:1 + 23 - 4 = 20。
给出N和M,求出所有合法的序列的个数。
输入描述:
两个整数N,M ( 1 <= N <= 7, -100 <= M <= 100)
输出描述:
合法序列的个数
示例1
输入 7 0 输出 6
思路:
对于给定的顺序数列,我们只需要添加三种运算符,分别是‘+’,‘-’,‘’。
依次对照上文中提到的三个条件:
- 递归终止条件:当 i 等于 n 时,整个表达式就可以求值了,这里用到了eval这个函数,作用就是将输入的字符串识别为表达式并输出其值。
- 返回值是什么?这个递归有点东西,不到最后一刻不返回值的,所以我们定义了res【0】这样一个单元素数组。如果仅仅定义一个res元素, 那么必须在函数内声明res是全局变量,不然的话递归无法输出正确的值。
- 在 i 不等于 n 之前,我们要考虑三种添加字符的情况,这就是每一步的递归。
def dfs(i,s):
if i == n:
if m == eval(s):
res[0]+= 1
else:
dfs(i+1,s+'+'+str(i+1))
dfs(i+1,s+'-'+str(i+1))
dfs(i+1,s+str(i+1))
if __name__ == '__main__':
n,m = map(int, input().split())
res = [0]
dfs(1,'1')
print(res[0])