递归小结

递归题目汇总

关于递归,我们需要关心的主要是以下三点:

  1. 整个递归的终止条件。
  2. 一级递归需要做什么?
  3. 应该返回给上一级的返回值是什么?
    因此,也就有了我们解递归题的三部曲:
  4. 找整个递归的终止条件:递归应该在什么时候结束?
  5. 找返回值:应该给上一级返回什么信息?
  6. 本级递归应该做什么:在这一级递归中,应该完成什么任务?

先上手一道今天看到的牛客网的题目,有点难度。不过没关系,后面有简单的,我会慢慢补充,今天太累了,先写一道题目。

牛客网题目:如何添加运算符

题目描述

给出一个数字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

思路:
对于给定的顺序数列,我们只需要添加三种运算符,分别是‘+’,‘-’,‘’。
依次对照上文中提到的三个条件:

  1. 递归终止条件:当 i 等于 n 时,整个表达式就可以求值了,这里用到了eval这个函数,作用就是将输入的字符串识别为表达式并输出其值。
  2. 返回值是什么?这个递归有点东西,不到最后一刻不返回值的,所以我们定义了res【0】这样一个单元素数组。如果仅仅定义一个res元素, 那么必须在函数内声明res是全局变量,不然的话递归无法输出正确的值。
  3. 在 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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值