2017-10-24 15 views
1

再帰を把握しようとしています。一般的に私はそれが何をしているのか理解していますが、私は以下の方法がどのように機能するかを理解するのに問題があります。リスト内の要素を再帰的メソッドでカウントする

def count_numbers_in_list(list): 
    if list == []: 
    return 0 
    return 1 + count_numbers_in_list(list[1:]) 

これで、list[1:]は、最初のものを除いて、指定されたリストからすべてを返します。

しかし私が頭を上げることができないのは、リストそのものに-1のようなものを呼ぶことはないということです。したがって、この関数は完全に機能しますが、この関数が無限ループを返すことも私には意味があります。

ここで何が起きているのか誰かが私に正確に説明できることを願っています。

ありがとうございます!

+1

'list [1:]'が何をするのかを決定する必要があります。 – miradulo

+0

'私はそのリストを取得する[1:]は、最初のものを除いて、指定されたリストからすべてを返します。 –

+0

問題がある場合は、 'print'ステートメントを使ってデバッグしてください。あなたはそれを簡単に手に入れるべきです。 –

答えて

0

ここで、リスト[1:]は、最初のものを除く指定されたリストからすべてを返します。

実際、この機能が完全に機能する理由を説明した回答が見つかりました。たびに再帰が行われ

return 1 + count_numbers_in_list(list[1:]) 

それに残された要素がなくなるまで、count_numbers_in_listは短いリストが与えられます。

はこれを打破するのをしてみましょう。あなたが以下のリストを持って考えてみましょう:

lst = [1, 2, 3, 4] 

count_numbers_in_listは、最初に[1, 2, 3, 4]を与えられます。

  1. 0 + count_numbers_in_list([1, 2, 3, 4])
  2. (0 + (1 + count_numbers_in_list([2, 3, 4]))
  3. (1 + (1 + count_numbers_in_list([3, 4]))
  4. (2 + (1 + count_numbers_in_list([4]))
  5. (3 + (1 + count_numbers_in_list([])))
  6. (4 + (count_numbers_in_list([])))
  7. (4 + 0)

結果が4です。

+0

右!関数内で何が起こっているかを正確に表示するために 'print'メソッドも使用しました。しかし、最後に空の '[]'に来るとき、 'if list == []:return 0'と言う。 3行目で 'return 0'を呼び出した後でも、この関数は4(あなたの場合)を返しますか? –

+0

各ステップを見ると、前回の再帰から来た値に '1'を追加すると、再帰が実行されるたびに返される値が増えます。 – ozgur

+0

大きな説明オズグル、ありがとう! –

0

この再帰的カウント方法は、基本的には「私のリストが空の場合、それは私の基本的なケースです。ここには0個の要素があります。そうでなければ、要素の1つだけを数えることができます。 "

「1+」は「要素の1つを数えます」と言っています。 "count_numbers_in_list(list [1:])"は、 "リストの最初の要素を除くすべてをカウントする"と言っています。

次に、それをある種の遅延実行、またはそれに精通しているスタックと考えるだけです。リスト[1、2、3]があるとします。再帰的ステートメントでは、「count([2,3])」の結果として計算された値を返します。同様に、[2,3]への答えは[3]への答えが何であれ1プラスです。 3が1 + 0 = 1として解決され、それが[2,3]に戻されます。それは1 + 1 = 2として解決し、2は[1、2、3]の結果に戻されます。それは1 + 2 = 3として解決し、それがあなたの最終的な答えです。

関連する問題