2017-11-10 8 views
-3

私はプログラミングが初めてで、コンピュータサイエンス入門コースを受講しています。私たちはPython 3.6で作業しています。私たちの教授が教えてくれた練習があります。私のコードで "Return 0"が動作するのはなぜですか?

基本的に、入力がリストであり、値の合計を返さなければならないような関数を書く必要があります。最初のリストの要素としてリストがある場合は、その中のすべての数を合計する必要があります。

私の友人が私を助け、コードは機能しましたが、なぜそれが機能するのか理解できません。

ここでは、コードです:

def f(L): 
    sum = 0 
    if len(L)==0: 
     return 0 
    if isinstance(L[0], int): 
     sum = sum + L[0] 
    elif isinstance(L[0], list): 
     sum = sum + f(L[0]) 

    L.remove(L[0]) 

    return sum + f(L) 

入力の例は次のとおりです。

print(f([[99777634], [97179966, 91871251], [99887343, 97636420], [92431849]])) 

誰かがこの「リターン0」が動作し、なぜそれがどのように動作するかを私に説明できますか?

+3

私には分かりませんが、私はその質問を理解しています。コードのその部分は、リストが空(長さが0)かどうかをチェックし、その場合は0を返します。空リストの合計が実際には0であるため、これは正しいです。 – sepp2k

+0

再帰を終了できるように、再帰的な基本ケースのように見えます。また、リストを反復して、センチネルを使わずに合計を計算できるので、あなたがやっていることを行う良い方法のようには思えません。 – birryree

答えて

2

この関数は再帰を使用しています。同じ関数内から関数を呼び出すと、簡単に再帰が呼び出されます。これがしていることは、リストの最初の要素のタイプを調べることです。そして、その要素が整数であれば、それを合計に加え、リストの次の要素に移動します。それがリストである場合、その内部リストで関数を再度呼び出し、そのリストの合計を全体の合計に加算します。私はあなたのクラスでもっと学ぶという再帰を使わずに、あなた自身でこれをやろうと勧めています。

2

再帰関数では、常に(少なくとも)1つの基本ケースが必要です。つまり、関数が繰り返されることなく返される入力です。このブランチ(リストLが空の場合)はその目的を果たします。 (他の2つの場合は、となります)

3

これは再帰関数です。リストの残りの要素の合計に最初の要素を追加することによって、リストのすべての要素の合計が見つかるという単純な観察に基づいています。

すべての再帰アルゴリズムには、基本ケースが必要です。これは、関数を再度呼び出すことなく、結果が直接決定される入力です。そうでなければ、それは永遠に自分自身を呼び続けるでしょう。この場合、空のリストは基本ケースであり、その合計は0です。この方法では、前回の呼び出しで最初の要素の値にその結果を追加すると、最初の要素が取得されます。

0は「付加的なアイデンティティ」なので、空のリストのベース値として使用されます。加算の代わりに乗算した場合は、乗法的な識別情報なので1を使用します。

関連する問題