2017-06-05 26 views
1

私はダイスロールのすべての可能な置換を取得しようとしています。以下は私のコードです。AttributeError: 'NoneType'オブジェクトに 'append'(再帰関数)属性がありません

def PrintAllPerms(n, arr, str_): 
    if (n == 0): 
     print str_ 
     arr.append(str_) 
     return arr 
    else: 
     for i in ["1","2","3","4","5","6"]: 
      str_ = str_ + i 
      arr = PrintAllPerms(n-1,arr,str_) 
      str_ = str_[:-1] 

PrintAllPerms(2,[],"") 

しかし、これだけ多く印刷した後はエラーが発生しました。

PrintAllPerms(2,[],"") 

11 
12 
13 
14 
15 
16 
21 

<ipython-input-7-d03e70079ce2> in PrintAllPerms(n, arr, str_) 
     2  if (n == 0): 
     3   print str_ 
----> 4   arr.append(str_) 
     5   return arr 
     6  else: 

AttributeError: 'NoneType' object has no attribute 'append' 

なぜ2,1まで印刷されるのですか?

これに対処する正しい方法は何ですか?

答えて

2

elseブランチでarrを返す必要があります。

def PrintAllPerms(n, arr = [], str_ = ''): 
    if n == 0: 
     print(str_) 
     arr.append(str_) 
     return arr 
    else: 
     for i in ['1','2','3','4','5','6']: 
      str_ = str_ + i 
      arr = PrintAllPerms(n-1,arr,str_) 
      str_ = str_[:-1] 
     return arr 

PrintAllPerms(2) 
3

これは、次の行にある:

arr = PrintAllPerms(n-1,arr,str_) 

はあなたのPrintAllPerms機能は、それがelseパスを取る場合は、何も返さないので、それはNoneを返すだかのように扱われています。したがってarrNoneに設定されます。

関連する問題