5

これは私が持っているものであり、なぜ機能しないのかわかりません

def sum(n):
    if (n>0):
        print (n)
        return sum(n)+sum(n-1)
    else:
        print("done doodly")

number = int(input(":  "))
sum(number)

たとえば、ユーザーが 5 を入力した場合、5+4+3+2+1 の合計を計算するようにプログラムしたいと思います。私は何を間違っていますか?

4

7 に答える 7

7

2つのこと:

  • forをsum(n)計算するときに呼び出しても、無期限に再帰するため、あまり役に立ちません。したがって、行は正しくありません。他の値の合計にプラスする必要があります。これは、計算したいものであるため、理にかなっています。sumnreturn sum(n)+sum(n-1)nn - 1
  • 基本ケースと再帰ケースの値を返す必要があります。

そのため、コードを次のように単純化できます。

def sum(n):
    if n == 0:
        return 0
    return n + sum(n - 1)
于 2013-11-13T23:08:37.667 に答える
2

再帰は、最初の n 個の数の合計を計算するのに間違った方法です。これは、コンピューターに計算を行わせるためですn(これは O(n) 時間で実行されます)。これは無駄です。

で組み込みsum()関数を使用することもできますがrange()、このコードはきれいに見えますが、それでも O(n) で実行されます。

>>> def sum_(n):
...     return sum(range(1, n+1))
...
>>> sum_(5)
15

再帰の代わりに、O(1) 時間で実行されるため、算術級数の合計の式を使用することをお勧めします。

>>> def sum_(n):
...     return (n + n**2)//2
...
>>> sum_(5)
15
于 2013-11-14T08:16:10.690 に答える
2

returnあなたはいつn==0(あなたのelse)を忘れましたか

>>> def Sum(n):
...   if not n:
...     return 0
...   else:
...     return n + Sum(n-1)
... 
>>> Sum(5)
15
于 2013-11-13T23:05:33.313 に答える
1

コードを次のように複雑にすることができます。

def my_sum(n, first=0):
    if n == first:
        return 0
    else:
        return n + my_sum(n-1, (n+first)//2) + my_sum((n+first)//2, first)

利点は、log(n)スタックの代わりにnスタックのみを使用するようになったことです

于 2013-11-13T23:45:33.930 に答える