web-dev-qa-db-ja.com

Pythonの再帰の基本

「整数のリストを取り、リスト内のすべての整数の合計を返す再帰関数「listSum」を作成します」。

例:

>>>> listSum([1,3,4,5,6])
19

私はこれを別の方法で行う方法を知っていますが、再帰的な方法ではありません。

def listSum(ls):
    i = 0
    s = 0
    while i < len(ls):
        s = s + ls[i]
        i = i + 1
    print s

特別な組み込み関数は許可されていないため、これを行う基本的な方法が必要です。

23
Sebastian S

早期終了は、再帰関数の典型です。 seqは空の場合は偽です(したがって、合計する数値が残っていない場合)。

スライス構文により、現在のステップで整数が消費されることなく、再帰的に呼び出される関数にシーケンスを渡すことができます。

def listSum(seq):
    if not seq:
        return 0
    return seq[0] + listSum(seq[1:])

print listSum([1,3,4,5,6])  # prints 19
3
def power(a,b): #a^b
    if b==0:
        return 1
    Elif b>0:
        return a * power(a,b-1)
    Elif b<0:
        return power(a, b+1)/a
0
Anonymous
def listsum(list):
    if len(list) == 1:
        return list[0]
    else:
        return list[0] + listsum(list[1:])

print(listsum([1,5,9,10,20]))

この再帰関数の背後にある基本的な考え方は、if len(list) == 1:として表示されるベースケースがあるかどうかを確認することです。基本ケースでは、リストreturn list[0]の値を返すだけです。それ以外の場合、リストにはまだ複数の要素があります。 else:ステートメントでは、リストの最初の要素であるlist[0]をリスト内の残りの要素に追加します。これは、リストを1要素短くした関数を再帰的に呼び出すことで表示されます。 -インデックス0-- listsum(list[1:])の要素。この処理は、ベースケース(長さ1のリスト)に達するまでリストが小さくなり、最終結果が得られます。

0
Ramazan
def listSum(L):
    """Returns a sum of integers for a list containing
    integers.
    input: list of integers
    output: listSum returns a sum of all the integers
    in L.
    """
    if L == []:
        return []
    if len(L) == 1:
        return L[0]
    else:
        return L[0] + listSum(L[1:])
print listSum([1, 3, 4, 5, 6])
print listSum([])
print listSum([8])
0
Eliza

別のバージョン:

def listSum(ls):
    ls_len = len(ls)

    # Base condition
    if ls_len==1:
        return ls[0]
    if ls_len==0:
        return None
    # ls = listSum(ls[0:i]) + listSum(ls[i:])
    Elif ls_len%2==0:
            i = int(ls_len/2)
            return listSum(ls[0:i]) + listSum(ls[i:])
    else:
        i = int((ls_len-1)/2)
        return listSum(ls[0:i]) + listSum(ls[i:])

@thefourtheyeの例に従ってください。

listSum([1, 3, 4, 5, 6]) = listSum([1, 3]) + listSum([4, 5, 6])
                         = (listSum([1]) + listSum([3])) + (listSum([4]) + listSum([5, 6]))
                         = (listSum([1]) + listSum([3])) + (listSum([4]) + (listSum([5]) + listSum([6])))

基本条件:lsに要素が1つしかない場合、この値を返します。

0
Belter