如何通过在python中添加或减去给定的4个数字来获取数字列表

时间:2018-02-07 23:43:15

标签: python python-3.x algorithm

我试图获得从1到n的可能数字,给出4个数字。通过添加或减去4个数字中的2个或更多。

e.g。它进入numlist(1,2,3,16)的循环。以下是代码:

def numlist(a,b,c,d):  
    #user input of 4 numbers a,b,c,d
    # assigning variables value of -1. This will be used to provide -1 or +1 or 0
    p=-1 
    q=-1 
    r=-1
    s=-1
    count=0
    myarray=[]

    mysum=a+b+c+d  #sum of given 4 numbers


    for x in range(mysum):
        while count<mysum:
            if p<=1:
                if q<=1:
                    if r <=1:
                        if s<=1:
                            n1=p*a+q*b+r*c+s*d #number to be generated by adding/subtracting
                            s=s+1
                            #print(n1)
                            if n1>0 and (n1 in myarray)==False:
                                #print(n1)
                                myarray.append(n1) #add to myarray if number is positive and not already present
                                myarray.sort()  #sort myarray
                                count=count+1
                            if count==mysum:
                                 break
                        else:
                            s=-1

                        r=r+1
                    else:
                        r=-1

                    q=q+1
                else:
                    q=-1

                p=p+1
            else:
                p=-1

    print(len(myarray),'total')
    print(myarray)
numlist(1,3,4,14)

输出

  

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]

但如果是numlist(1,3,4,19) 它继续运行而不会结束数组的输出。只显示总数。

我哪里错了?

2 个答案:

答案 0 :(得分:2)

我认为您应该重新考虑您的算法。考虑一下:

from itertools import combinations

def numlist(lst):
    lst = lst + [-i for i in lst]
    result = set()
    for i in range(2, 5):
        result.update(sum(k) for k in combinations(lst, i))
    return sorted(i for i in result if i > 0)

numlist([1, 3, 4, 19])
# [1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]

答案 1 :(得分:0)

我做了一些补丁工作,发现了你逻辑上的高级问题。

当无法使用输入值形成count的当前值时,您的代码将进入无限循环。您的逻辑无法递增count,直到找到创建该值的方法。你可以在一个系数之后旋转一个系数。

for x in range(mysum):
    print ("top of loop; x =", x)
    while count<mysum:
        print("count", count, "\tmysum", mysum, "\tcoeffs", p, q, r, s)
        if p<=1:
...