题解 | #数组分组#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 江苏

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
09-25 10:34
东北大学 Java
多面手的小八想要自然醒:所以读这么多年到头来成为时代车轮底下的一粒尘
点赞 评论 收藏
分享
47 9 评论
分享
牛客网
牛客企业服务