使用Python递归操作实现关于某个面试题

这是我的第0篇文章

题目: li = [2,3,5,7,9],输出任意组合,可以重复选,输出所有和是 13 的组合

递归思路很简单。递归算法就像打开一个文件夹,文件夹里面有另外一个文件夹,当文件夹下没有文件夹了就返回

本题有5个文件夹,那么只需要打开每一个文件夹下面的文件夹,记录已打开文件夹所代表的值就行了,当值大于等于13就返回

递归函数内有三种情况:
1.元素和 su>13
2.元素和 su==13
3.元素和 su<13

前两个为回归的条件

N = 13#
sum_set = []#存放和为13的组合存放列表


def remove_duplicate(sum_list):#对sum_set进行排序,去重
    new_set = []
    for i in sum_list:
        i.sort()
        i = list(map(int, i))
        new_set.append(i)
    new_set = list(set([tuple(i) for i in new_set]))
    return new_set


def fun(li, su, n):#递归部分,li为列表,su为列表数值和,n为字符串
    if su == N:#结束条件1
        sum_set.append(list(n))
        return su
    elif su > N:#结束条件2
        return -1
    else: #所有可能性都加起来
        return(
            fun(li, su+int(li[0]), n+'2')
            + fun(li, su+int(li[1]), n+'3')
            + fun(li, su+int(li[2]), n+'5')
            + fun(li, su+int(li[3]), n+'7')
            + fun(li, su+int(li[4]), n+'9')
        )


def main():
    fun([2, 3, 5, 7, 9], 0, '')#li为列表,su为列表数值和默认0,n为字符串默认空
    print(remove_duplicate(sum_set))#去重


if __name__ == '__main__':
    main()

输出
[(2, 2, 2, 7),
(2, 2, 2, 2, 5),
(2, 2, 3, 3, 3),
(2, 2, 9),
(2, 3, 3, 5),
(3, 5, 5),
(2, 2, 2, 2, 2, 3),
(3, 3, 7)]

以上为所有可能组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值