「整数のリストを取り、リスト内のすべての整数の合計を返す再帰関数「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
特別な組み込み関数は許可されていないため、これを行う基本的な方法が必要です。
早期終了は、再帰関数の典型です。 seq
は空の場合は偽です(したがって、合計する数値が残っていない場合)。
スライス構文により、現在のステップで整数が消費されることなく、再帰的に呼び出される関数にシーケンスを渡すことができます。
def listSum(seq):
if not seq:
return 0
return seq[0] + listSum(seq[1:])
print listSum([1,3,4,5,6]) # prints 19
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
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のリスト)に達するまでリストが小さくなり、最終結果が得られます。
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])
別のバージョン:
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つしかない場合、この値を返します。