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

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下 HR 会来跟你谈。” 我当时脑子直接宕机,一句话都没憋出来。后面 HR 找我谈话,直属领导也在旁边。HR 说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
50
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务