1

私はその名前がpositive_negativeである関数を持っています

def positive_negative(list_changes):
    """ (list of number) -> (number, number) tuple

    list_changes contains a list of float numbers. Return a 2-item
    tuple where the first item is the sum of the positive numbers in list_changes and
    the second is the sum of the negative numbers in list_changes.

    >>> positive_negative([0.01, 0.03, -0.02, -0.14, 0, 0, 0.10, -0.01])
    (0.14, -0.17)
    """

次のように、リスト手法を使用してこの関数を作成できます。

def positive_negative(list_changes):
    pos = sum([item for item in list_changes if item > 0.0])
    neg = sum ([item for item in list_changes if item < 0.0]) 
    return pos, neg

それは良い解決策です。今私の質問は、再帰手法を使用して同じ関数を解決する方法です。次のコードを試しましたが、残念ながら何か問題があります。

def positive_negative(list_changes):
    pos = 0.0
    neg = 0.0
    if len(list_changes)== 0:
        pos =+ 0.0
        neg =+ 0.0
        return pos,neg
    else:
        if list_changes[0] > 0.0 :
            pos =+ list_changes[0]
        else:
            neg =+ list_changes[0]
        positive_negative(list_changes[1:])


    return pos,neg 

私の間違いと正しい再帰関数を取得する方法を見つけるのを手伝ってくれませんか。

ありがとうございました

4

3 に答える 3

2

あなたの最初の問題はこれです:

pos =+ list_changes[0]

=+Python には演算子がありません。したがって、これは次と同等です。

pos = (+list_changes[0])

list_changes[0]は数値であり、任意の数値+nと同じであるためn(ここでは問題にならない特定の特殊なケースを除きます)、posそれに追加するのではなく、毎回置き換えるだけです。

おそらくこれが必要です:

pos += list_changes[0]

+=しかし、まったく使用しようとしているという事実は、より根本的な誤解です。スタック上の の各インスタンスにpositive_negativeは、独自のposandneg値があります。これらは 0.0 から始まり、それらに0.0orlist_changes[0]を追加し、それらに影響を与えない関数を呼び出してから、それらを返します。0.0, list_changes[0]したがって、いずれかまたはlist_changes[0], 0.0;を返すことになります。リストの後半に何が来ても、結果には影響しません。


再帰関数呼び出しで何かを追加したい場合は、その戻り値で何かをする必要があります。このようなもの:

def positive_negative(list_changes):
    if len(list_changes)== 0:
        return 0.0, 0.0
    else:
        pos, neg = positive_negative(list_changes[1:])
        if list_changes[0] > 0.0:
            pos += list_changes[0]
        else:
            neg += list_changes[0]
        return pos, neg

もちろん、このソリューションは明らかに末尾再帰ではありません... しかし、それは問題ではありません。Python は末尾再帰の最適化を行わないからです。これがあなたが達成しようとしていたことに最も近い解決策だと思います。

于 2013-04-03T23:56:27.707 に答える
2

いくつかのアキュムレータ (psum、nsum) の使用:

def positive_negative(list_changes, psum=0, nsum=0):
    if len(list_changes) == 0:
            return psum, nsum
    if list_changes[0] < 0:
            nsum += list_changes[0]
    else:
            psum += list_changes[0]
    return positive_negative(list_changes[1:], psum, nsum)

# and another version:
def positive_negative2(list_changes, psum=0, nsum=0):
    if len(list_changes) == 0:
            return psum, nsum
    if list_changes[0] < 0:
            return positive_negative(list_changes[1:], 
                            psum, nsum + list_changes[0])
    return positive_negative(list_changes[1:], 
                            psum + list_changes[0], nsum)

print positive_negative([0.01, 0.03, -0.02, -0.14, 0, 0, 0.10, -0.01])

出力

(0.14, -0.17)

補足として、python は末尾呼び出しの最適化を行わないため、再帰を使用する場合は注意してください。リストに約 1000 個の項目がある場合、上記の関数は失敗します。

于 2013-04-03T23:57:21.773 に答える