2016-03-22 13 views
-4

私は整数nをとり、最初のn個の逆数の合計を返す基本的な再帰関数を書いています。 2を入力すると、1.5をもたらすはずであり、0を入力すると、0Python 3再帰 - 最大深度を超えました

sum_to(2)=(1 + 1/2)= 1.5

ここで私が何を返すべきである:

def sum_to(n): 
    if n>0: 
     return sum_to(1+1/n) # Not sure if this is correct 
    return 0 

しかし、私が得ているのは、最大再帰深度を超えていることです。私はこれを解決するためのリストを知ることができると知っていますが、再帰は本当に面白くて、私はそれを使って解決策を見つけたいと思います。あなたがあなたの終了条件に達するかどうかを確認するために、それを通して

+0

「これが正しいかどうかわからない」必要があります。あなたのプログラムによると、sum_to(1)は1 + sum_to(1)と同じです。それが正しいかどうか分かりませんか? – Goyo

+0

これは偶然あなたの質問に関連していますか? http://stackoverflow.com/questions/31323495/1-1-2-1-3-%C2%BC-finding-sum –

+0

1を加え続けても、nは0に等しくなりますか? – AJPennster

答えて

1

、再帰関数では、あなたがベースを定義する必要があることを忘れないでください、その後0

を返し、あなたが入力が0である場合

\sum_{i=1}^{n} 1/i 

を計算したいようですケースおよび誘導節。あなたの質問に

は、誘導句は次のとおりです。

ベースケースが 0 i=0に設定することができながら、
1.0/i + sum_of_reciprocals(i-1) 

。この処方を考える

は、例の関数は次のようになります。

def sum_to(n): 
    if n > 0: 
     return sum_to(n-1) + 1.0/n 
    else: 
     return 0 

if __name__ == '__main__': 
    print(sum_to(3)) 

と結果が1.83333333333です。

再帰関数の詳細については、related wikipedia pageから開始できます。

+0

ありがとうございました。簡潔かつ簡潔です。リンクされたwikiページは高く評価されていますが、私はすぐにいくつかの練習の再帰を作成すると確かに役に立ちます。 –

1

トレース:

(PS:時、私は質問のコードはreturn 1 + sum_to(1/n)だったこれを書いた)

sum_to(2): 
    n is 2, which is > 0 
    call sum_to(1/2) 
     n is .5, which is > 0 
     call sum_to(1/.5) 
      n is 2, which is > 0 
      call sum_to(1/2) 
... 

あなたの関数が戻ることはありません。アルゴリズムが終了していないため、計算を完了するための無限の時間とスペースがあった場合、結果は無限になります。

def sum_to(n): 
    return 1 + 1/n 

が期待された結果、N> 2どのようなものです:

ご例えば

は、ちょうどそれをこのように書くのか?これにより、作業コードの編成にどのようにアプローチするかが決まります。質問から

+0

ありがとう、私は今エラーが表示されます。期待される結果は、n個の逆数の和でなければならない。例。 sum_to(2)=(1 + 1/2)ここでsum_to(3)=(1 + 1/2 + 1/3)となる。質問を誤って言い表したのは間違いです。私は基本的に、逆数が1/nである点まで逆数を見つけてそこで止めたいと思っています。 –

+1

したがって、 'x 'の位置にある任意の項は' 1/x'です。第1項「1/1 == 1」、第2「1/2」、第3「1/3」。だから、各項は連続した位置をとっているので、 'return 1/n + sum_to(n-1)'を欲しい。これは今albertoqlの答えでよく説明されています。 – dsh

関連する問題