2016-08-31 14 views
-4

以下のコードは2つの引数をとり、[5,5,5]のようなものを返す再帰関数です。再帰:2つの引数を受け取るrecicate_recurという再帰関数を設計します。

def recursive(times, data): 
    if not isinstance(times,int): 
     raise ValueError("times must be an int") 
    if not (isinstance(data,int) or isinstance(data, str)): 
     raise ValueError("data must be an int or a string") 
    if times <= 0: 
     return [] 
    return [data] + recursive(times, data - 1) 

print(recursive(3, 5)) 

なぜコードが再帰的エラーを投げているのですか?

答えて

1

我々は再帰的に任意のデータ項目をN回繰り返すだろうかと考えてみましょう:

  • timesが0以下であれば、我々は必要条件に従って、空のリストを返します。
  • timesが0より大きい場合は、data個のデータとtimes - 1個のデータの繰り返しを再帰的に含むリストを返します。

もう1つの要件は、引数の妥当性をチェックし、無効な場合はValueErrorにすることです。これは同じ再帰関数で実行できますが、これは同じ検証であるtimes回を実行するので、パフォーマンスヒットをもたらします。このためのテキストブックの解決策は、関数を2つに分離することです。これは、バリデーションを処理する「外部」関数と、再帰的ロジックを処理する「内部」関数です。

一緒にすべてを入れて、あなたはこのような何か買ってあげる:

def replicate_recur(times, data): 
    if not isinstance(times, int): 
     raise ValueError("times must be an int") 

    return real_replicate_recur(times, data) 

def real_replicate_recur(times, data): 
    if times <= 0: 
     return [] 

    return [data] + real_replicate_recur(times - 1, data) 
0

あなたは現在の再帰呼び出しの結果を格納するためのリストを使用できます。

def replicate_recur(times, data, ret=None): 
    if not ret: 
     ret = [] 
    ret.append(data) 
    times -= 1 
    if not times: 
     return ret 
    return replicate_recur(times, data, ret) 
+1

みんなありがとうをデクリメントのデータ引数をデクリメントしながら、考慮項目の変数を取り、助けロット、私はそれを動作させるためにコードをリファクタリングしました。今はうまくいきます。再度、感謝します – Iakhator

0

あなたのコードが実際に正常に動作することになって、問題はその基本ケースである再帰関数ではなく、times引数に