这是我的第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)]
以上为所有可能组合