0
def recursive_add(s):
    sum = 0
    if len(s) == 1:
        sum += s[0] ** 2
    else:
        recursive_add(s[1:])
        sum += s[0]**2
    return sum


s = [8, 6, 8, 4]

print recursive_add(s)

ただし、何らかの理由で、8 はすぐに 2 乗され、64 が返されます。これは、2 乗して合計に追加する最後の数値である必要があります。

4

6 に答える 6

3

まず、特定の問題に対するワンライナーソリューション:

def rec_add(s):
    return s[0] * s[0] + rec_add(s[1:]) if s else 0

より高度で抽象的なものが続きます。

関数型プログラミングの専門用語では、x ** 2をリストに「マップ」し、その要素を一緒に追加してリストを「折りたたむ」。Pythonは、そのために必要なプリミティブ(mapおよびreduceそれぞれ)を提供し、二乗和は次のように簡単に記述できます。

from operator import add, mul

xs = [1,2,3,5]
print reduce(add, map(mul, xs, xs)) # 39

マップとフォールドのステップを1つの関数に組み合わせることもできます。

def map_and_fold(xs, mapfun, foldfun, init):
    if not xs:
        return init
    return foldfun(
        mapfun(xs[0]),
        map_and_fold(
            xs[1:], mapfun, foldfun, init))

sum_squares上記の部分適用として定義します。

from functools import partial

sum_squares = partial(map_and_fold, 
    mapfun = lambda x: x * x,
    foldfun = lambda x, y: x + y,
    init = 0)

テスト:

xs = [1,2,3,5]
print sum_squares(xs) # 39

詳細:マップフォールド部分適用

于 2012-04-20T08:16:46.030 に答える
2

次のことができます。

def recursive_add(s):
    return s and (recursive_add(s[1:]) + s[0]**2) or 0

元のコードでは、問題は と同じものをrecursive_add(s[1:])共有していないようです。sは別のものです。代わりにこれを試してください:sumrecursive_add(s)sum

sum = 0

def recursive_add(s):
    global sum
    if len(s) == 1:
        sum += s[0] ** 2
    else:
        recursive_add(s[1:])
        sum += s[0]**2

s = [8, 6, 8, 4]

print recursive_add(s)
于 2012-04-20T07:41:01.697 に答える
1

プログラムが正しく機能していない理由を理解しようとしているときは、プログラムが何をしているのかを正確に把握することをお勧めします。これは、プログラムが実際に何をしているのかを示すためにプログラムを変更する方法の例です。

def recursive_add(s):
    print "DEBUG: recursive_add(%s)" % repr(s)
    sum = 0
    print "DEBUG: sum: %d" % sum
    if len(s) == 1:
        sum += s[0] ** 2
        print "DEBUG: sum: %d" % sum
    else:
        recursive_add(s[1:])
        sum += s[0]**2
        print "DEBUG: sum: %d" % sum
    return sum


s = [8, 6, 8, 4]

print "result: %d" % recursive_add(s)

これを実行すると、次のようになります。

DEBUG: recursive_add([8, 6, 8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([6, 8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([4])
DEBUG: sum: 0
DEBUG: sum: 16
DEBUG: sum: 64
DEBUG: sum: 36
DEBUG: sum: 64
result: 64

ご覧のとおり、関数はリストから最初の番号を正常に切り取り、すべての番号を処理するまで再帰的に呼び出します。ただし、問題は、合計を0に再設定し続けるため、合計が実際の合計を累積しないことです。したがって、最終的な答えは0 + 64、つまり64です。

于 2012-04-20T08:16:53.723 に答える
0

あなたのコードはあなたが望むものではありません。そもそも、declare sum = 0intorecursive_addは、予想とは異なる動作をもたらします。

で変更することをお勧めします

def recursive_add(s,sum):
 if len(s) == 1:
  return sum + s[0] ** 2
 else:
  sum = s[0] ** 2 + recursive_add(s[1:],sum)
 return sum

そして、そのように呼びます

s = [8, 6, 8, 4]
print recursive_add(s,0)
于 2012-04-20T07:42:02.587 に答える