1

文字列置換問題をコード化しようとしています。文字列の代わりに[1,2,3]のような整数のリストがあります。私はリストのすべての可能な順列を印刷しなければならない。しかし、私のコードにはわからない問題があります。どういうわけか、ベースケースのif not in words行は一度だけヒットします。私は過去1時間からこれを理解しようとしています。どんな助けもありがとう! TIA は、ここでバグがあなたがそうあなたが変更されましたが、変更が記録されていなかっただけのコピーで終わる同じリストnumsを変更しておくことで、コード配列置換のグローバル変数に文字列置換が追加されない理由を追跡できません

words = list() 
def permute(nums): 
    if len(nums) == 0: 
     return None 

    l = 0 
    r = len(nums) 

    permute_helper(nums,0,r) 

def permute_helper(nums,start,end): 
    current = 0 
    if start == end-1: 
     if not nums in words: 
      print 'appended' 
      words.append(nums) 
    else: 
     for current in range(start,end): 
      temp = nums[start] 
      nums[start] = nums[current] 
      nums[current] = temp 
      #Recursive call 
      permute_helper(nums,start+1,end) 
      temp = nums[start] 
      nums[start] = nums[current] 
      nums[current] = temp 

permute([1,2,3]) 
print words 
+0

itertoolsを使用してください... –

+0

ありがとうございます。私はそれを更新する –

+0

はるかに良い。ありがとう。 :-) –

答えて

1

です。

変更:

words.append(nums) 

へ:

words.append(nums[:]) 

numsのコピーを作成し、それを現在の状態 "フリーズ" します。

コメント:

temp = nums[start] 
nums[start] = nums[current] 
nums[current] = temp 

は行います:あなたの代わりに、より多くのニシキヘビの方法でスワップを行うことができます

nums[start], nums[current] = nums[current], nums[start] 
+0

ありがとうございます。それは完璧だった! –

+0

@KshitijG喜んで助けてください! – alfasin

0

あなたは同じリストを毎回追加しています。すでにそこにいるのは不思議ではない(in words)。

つまり、異なる順列を収集するのではなく、numsへの参照です。したがって、その後の順列はwordsに反映されます。それが変異の疫病です。

一つの解決策は、現在の順列のコピーを作成することです:ところで

words.append(nums[:]) 

を、ニシキヘビのスワップは、次のとおりです。

a, b = b, a # no need for tmp 

また、currentをリセットする必要はありません。

関連する問題