没有循环的列表中的子和

时间:2018-12-01 16:18:47

标签: python recursion

所以我正在研究递归,必须使用无循环

编写一些代码

对于我的代码的一部分,我想检查是否可以将列表的一个子集汇总为特定的数字,如果可以,则返回列表中这些数字的索引。

例如,如果列表为[5,40,20,20,20],并且我以数字60发送,则我希望我的输出为[1,2],因为40 + 20 = 60。 万一我找不到电话号码,输出应该是一个空列表。

我从

开始
def find_sum(num,lst,i,sub_lst_sum,index_lst):  
if num == sub_lst_sum:
    return index_lst
if i == len(sum): ## finished going over the list without getting to the sum
    return []
if sub_lst_sum+lst[i] > num:
    return find_sum(num,lst,i+1,sub_lst_sum,index_lst)
return ?..

index_lst = find_sum(60,[5,40,20,20,20],0,0,[])

num 是我要求和的数字

第一是数字列表

最后一个返回值应该同时覆盖我对列表中的当前数字进行计数而不对它进行计数的选项。(否则,在该示例中它将采用这五个数字,并且将没有解决方案)。 我不确定该怎么做。

1 个答案:

答案 0 :(得分:0)

这是一个提示。也许最简单的方法是考虑以下归纳推理来指导您的递归。

如果

index_list = find_sum(num,lst,i+1) 

然后

index_list = find_sum(num,lst,i)

也就是说,如果可以使用索引列表来使用位置num开始的元素构造总和i+1,那么使用位置i的元素也是一种解决方案向前。那应该很清楚。归纳推理的第二部分是

如果

index_list = find_sum(num-lst[i],lst,i+1) 

然后

[i]+index_list = find_sum(num,lst,i)

也就是说,如果索引列表可用于使用位置num-lst[i]开始的元素返回总和i+1,则可以使用它来构建索引列表,其各个元素的总和为通过附加num i

这两个归纳推理可以转换为两个递归调用以解决问题。同样,我写的第一个应该用于第二个递归调用,而不是第一个(问题:为什么?)。

对于没有解决方案的基本情况,您可能还要重新考虑使用空列表。可以,但是您将返回不是解决方案的列表作为解决方案。在python中,我认为None是惯用的标准选择(但您可能想与比我更精通python的人再次检查一下。)


填空

def find_sum(num,lst,i):  
    if num == 0  :
        return []
    elif i == len(lst) :
        return None 
    else :
        ixs = find_sum(???,lst,i+1)
        if ixs != None :
            return ???
        else :
            return find_sum(???,lst,i+1)