2016-10-27 39 views
0

リスト内のすべての整数の合計を返すプログラムを作成しようとしています(nより大きいかnに等しい)。例えば、ここでPython - リスト内の整数の合計(再帰的)

>>>floorSum([1,3,2,5,7,1,2,8], 4) 
20 

は私が思いついたコードです:

def floorSum(l,n): 
    if len(l)>0: 
     if l[0]<n: 
      floorSum(l[1:],n) 
     else: 
      s=l[0]+floorSum(l[1:],n) 
    return s 

は私が取得しています:UnboundLocalError: local variable 's' referenced before assignment.

任意のアイデア?

+3

関数には 's'に何も割り当てないパスがあります。そのような場合、返されるはずの関数は何ですか? – khelwood

+0

@khelwoodが正しいです。具体的には、 'l [0]

+0

@Oliverその場合だけではありません。 'len(l)'がゼロの場合もあります。 – khelwood

答えて

-1

Pythonは、リストの理解度を使って1行で行うことができる素晴らしい言語です。

s = sum([value for value in l if value >= n]) 

もう一つの方法は、最初のものは基本的に言うfilter

s = sum(filter(lambda e: e >= n, l)) 

を使用することです:

「彼らはすべて大きいか等しくなるように、lの要素から新しいリストを作成します。 n。新しいリストを合計してください。 "

第二1:

「その上n和に大きいかまたは等しい要素のみをフィルタリングします。」

これらの両方のテクニックについて十分な文書があります。

あなたは答えが有用であることが判明した場合、

+1

OPには再帰タグがあり、件名に明示的に再帰が指定されているため、これは答えではありません。 – pjs

3

を受け入れたとして、それをマークしますが、私は問題を解決しsおかげ

def floorSum(l,n): 
    s = 0 
    if len(l) > 0: 
     if l[0] < n: 
      s = floorSum(l[1:], n) 
     else: 
      s = l[0] + floorSum(l[1:], n) 
    else: 
     return 0 
    return s 
0

ゼロに初期化するために忘れてしまいました!

は、sが他の人が指摘したように、あなたはすべてのケースについてsを初期化し、ゼロの長さをチェックすることを怠っ0

+0

あなたは正しい回答をマークしてください –

2

=置くことを忘れました。

ことはここでは別のアプローチです:

def floorSum(l, n): 
    if len(l) > 1: 
     mid = len(l) // 2 # Python 3 integer division 
     return floorSum(l[:mid], n) + floorSum(l[mid:], n) 
    if len(l) == 1 and l[0] >= n: 
     return l[0] 
    return 0 

それは任意の少ない再帰スタックの深さを働いていませんがように、このバージョンでは、各ステップで半分にリストを分割しますO(ログ(LENです(l)))ではなく、O(len(l))である。これは、大きなリストのスタックオーバーフローを防ぎます。

このアプローチのもう1つの利点は、追加のストレージ要件です。 Pythonは両方のバージョンでサブリストを作成していますが、元のバージョンでは、サブリストに必要な追加の記憶域はO(n )である(n-1) + (n-2) + ... + 1です。逐次的な半分アプローチでは、追加のストレージ要件はO(n log n)であり、これはnの大きな値に対して実質的に低い。追加のストレージを割り当てて解放すると、大きなnの実行時間に影響を与えることさえあります。しかし、これは両方のアルゴリズムで、サブリストを作成するのではなく、引数として関心範囲のインデックスを渡すことで回避できます。

関連する問題