题解 | #数组分组#python3 递归 通俗易懂

数组分组

http://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

对递归不太熟 执着于自己的方法 写了大半年 终于写出来了 哭了

def add(sm5,sm3,temp):
    if len(temp)==0:
        if sm5==sm3:
            return True
        else: 
            return False
    else:
        return add(sm5+temp[0],sm3,temp[1:]) or add(sm5,sm3+temp[0],temp[1:])
while True:
    try:
        n=int(input())
        nums=list(map(int,input().split()))
        num3=[]
        num5=[]
        temp=[]
        for i in nums:
            if i%5==0:
                num5.append(i)
            elif i%3==0:
                num3.append(i)
            else:
                temp.append(i)
        sm5,sm3=sum(num5),sum(num3)
        a=add(sm5,sm3,temp)
        if a:
            print('true')
        else:
            print('false')
    except:
        break

错误写法:

def add(sm5,sm3,temp):
    if len(temp)==0:
        if sm5==sm3:
            return True
        else:
            return False
    else:
        a=temp.pop(0)
        return add(sm5+a,sm3,temp) or add(sm5,sm3+a,temp)
全部评论
语句 add(sm5+a,sm3,temp) or add(sm5,sm3+a,temp) 中的temp 是同一个列表。而语句add(sm5+temp[0],sm3,temp[1:]) or add(sm5,sm3+temp[0],temp[1:]) 中的temp[1:]会新建两个不同列表。 如果想不明白,可以在a=temp.pop(0) 后加print(temp),而在另一个语句类似位置加print(temp[1:])就可以看出差异了。
1 回复 分享
发布于 2022-01-07 23:16
公倍数情况应该也要考虑吧
1 回复 分享
发布于 2022-05-14 12:04
退出条件不是应该为sm5+sum(temp) == sm3 or sm3+sum(temp)==sum5么,不然的话,岂不是只往一边加,而且还没算剩余量
1 回复 分享
发布于 2022-05-25 23:39
add 函数是不是把所有的情况都穷举出来了
点赞 回复 分享
发布于 2021-12-02 23:12
有点意思
点赞 回复 分享
发布于 2021-12-05 14:19
谢谢你!你原来用pop的地方我用的remove,同样不行,改成[1:]就好了,感觉这两个指令和数组里的次序太相关,所以每次判断加5组还是3组的时候按照次序判断,想加到temp里最后一个一定要加前几个,不知道里面的原理
点赞 回复 分享
发布于 2021-12-20 06:20
可以用深拷贝list.copy() a = temp.copy() b = a.pop(0) 这样就不会改变原本的列表了
点赞 回复 分享
发布于 2022-02-27 14:56
我有个问题,穷举了递归的结果,那么为什么有的递归结果为False没有返回呢(确实只要一个True就应该返回True,但是函数中不是只要执行了return就终止了吗,穷举的递归方案实现有先后顺序吗,还是内置了“或门”呢)
点赞 回复 分享
发布于 2022-08-14 23:48
我没太理解 or 在这里的用法。为什么用or就会优先找return true的
点赞 回复 分享
发布于 2022-09-29 16:59 山东
肯定不能弹出,递归还没终止tmp早就弹出来完了,搜狗输入法太难用了***
点赞 回复 分享
发布于 2022-10-16 21:41 江苏
妙啊,还说不会递归?这不妥妥的凡尔赛
点赞 回复 分享
发布于 2023-05-14 18:58 浙江
妙,add函数的返回值为字符串true,false 的时候,为什么是错的
点赞 回复 分享
发布于 2023-06-30 17:35 上海
错误写法 pop完事之后需要把pop出来的数还原回去 然后dfs递归那一步尽量不要直接return 因为dfs是涉及到回溯步骤的
点赞 回复 分享
发布于 03-15 08:55 江苏

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
47 9 评论
分享
牛客网
牛客企业服务