0

特定のリストの数字を再帰的に合計するプログラムを作成しています。たとえば、ソース リストに 10 個の要素がある場合、2 番目のリストには 9 個、3 番目のリストには 8 個というように、1 個の要素しかない最後のリストまで続きます。これは、最初の要素を 2 番目の要素に追加し、次に 2 番目の要素を 3 番目の要素に追加するというように行われます。シェルからのフィードバックなしで立ち往生しています。エラーをスローせずに停止し、数秒でファンが狂ったように回転します。

ここでかなりの数の投稿を読み、アプローチを変更しましたが、これまでのところ、探している結果が得られるかどうかはわかりません. 前もって感謝します:

#---------------------------------------------------
#functions
#---------------------------------------------------

#sum up pairs in a list
def reduce(inputList):
    i = 0
    while (i < len(inputList)):
        #ref to current and next item
        j = i + 1
        #don't go for the last item
        if j != len(inputList):
            #new number eq current + next number
            newNumber = inputList[i] + inputList[j]
            if newNumber >= 10:
                #reduce newNumber to single digit
                newNumber = sum(map(int, str(newNumber)))
            #collect into temp list
            outputList.append(newNumber)
        i = i + 1
    return outputList;


#---------------------------------------------------
#program starts here
#---------------------------------------------------

outputList = []
sourceList = [7, 3, 1, 2, 1, 4, 6]
counter = len(sourceList)

dict = {}
dict[0] = sourceList

print '-------------'
print 'Level 0:', dict[0]

for i in range(counter):
    j = i + 1
    if j != counter:
        baseList = dict.get(i)
        #check function to understand what it does
        newList = reduce(baseList)
        #new key and value from previous/transformed value
        dict[j] = newList        
        print 'Level %d: %s' % (j, dict[j])
4

1 に答える 1

2

あなたのプログラムは常に、outputListあなたが外部で定義したものと同じものを使用します。を呼び出すたびにクリアする必要がありますreduce。代わりに、同じ名前のローカル変数を作成できます。outputListこれを行うには、次のように の定義をreduce関数に移動するだけです。

def reduce(inputList):
    outputList = []
    i = 0

出力

-------------
Level 0: [7, 3, 1, 2, 1, 4, 6]
Level 1: [1, 4, 3, 3, 5, 1]
Level 2: [5, 7, 6, 8, 6]
Level 3: [3, 4, 5, 5]
Level 4: [7, 9, 1]
Level 5: [7, 1]
Level 6: [8]
于 2013-11-09T03:55:59.280 に答える