2016-08-08 8 views
-1

アキュムレータ付きリストのリストで再帰関数を使用していますが、リストの正しいリストを作成するのではなく、アキュムレータに挿入された最後のアイテムのリスト。はるかに単純な再帰関数とリストで問題を再現しました。この関数は、リストのリストを取り、2つのコピーを作成し、それらをn回反転させます。Pythonの再帰関数はリストを変更しません

def recursauto(x, n, instSet): 
    #Base Case 
    if(n==0): 
     instSet.append(x) 
     print(x) #Print to see what SHOULD be added 
    else: 
     temp = [x]*(2) # Make a list with 2 copies of the original list 
     for i in range(len(temp)): 
      temp[i][i] = temp[i][i][::-1] # Make the list backwards 
     for i in range(2): 
      recursauto(temp[i], n-1, instSet) #Input each element 

MyList = [] #Empyt list for accumulator 
print("Correct output:") 
recursauto([["A", "l", "e", "x"], ["A", "b", "d", "a", "l", "a", "h"]], 2, MyList) 

print("Wrong printed list:") 
for i in MyList: 
    print(i) #Print what is in the accumulator 

出力が間違っており、アキュムレータに正しいものがありません。

Correct output: 
[['A', 'l', 'e', 'x'], ['A', 'b', 'd', 'a', 'l', 'a', 'h']] 
[['A', 'l', 'e', 'x'], ['A', 'b', 'd', 'a', 'l', 'a', 'h']] 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 
Wrong printed list: 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']] 

これは簡単な方法がありますが、私が実際に作成している関数には再帰が必要です。私が言ったように、これは私が持っている問題の単純化されたレクリエーションです。

+0

正しい出力は何ですか? – Lando

+0

正しい出力は、アキュムレータに入るリストです。これは、出力の「間違った印刷リスト:」行の前に印刷されているものと同じです。 –

+0

再帰関数の目的は何ですか? –

答えて

3
temp = [x]*(2) 

上の行は、二つコピー元のリストののリストを作成しません。実際には、同じ元のリストへの参照を2回だけ保存します。 xという別個のコピーが必要な場合は、temp = [list(x), list(x)]のようなリストコピーコンストラクタ、または浅いcopy method[x.copy() x.copy()]のようなリストコピーコンストラクタを使用してみてください。

次の例を参照してください。

>>> ls = ['a'] 
>>> dup = [ls] * 2 
>>> dup 
[['a'], ['a']] 
>>> ls.append('b') 
>>> dup 
[['a', 'b'], ['a', 'b']] 
+1

変数名に 'list'を使わないでください。 –

+1

より一般的な解: '[MyList for i in range(a)]'は、必要な独立リストの数です。リストのリストではなく、数字やNoneなどのハッシュ可能項目のリストを初期化する場合にのみ、*演算子を使用します。 –

+0

問題は、xの2 * n個のコピーが必要なので、私は実際にそれを行うということです。だから、temp = [x] *(2 * n)しています。それに代わるものは何ですか? –

関連する問題