2016-05-12 1 views
2

私は、与えられた数に再帰的にプログラムを追加するような素朴な実装をしていると言います。再帰制限を変更せずに1000000回に1を再帰的に追加する方法はありますか?

s=lambda n, i: i>0 and s(n+1, i-1) or n 

ただし、再帰制限を超えて追加することはありません。

s(0, 1000000) 

再帰で解決する方法はありますが、制限の変更はありませんか?

私はこの関数を900回呼び出す方法について考えましたが、数値がまだ0より大きい場合、それらの900をいくつかの数値に追加し、900を足した数を減らしてもう一度この関数を呼び出します。しかし、そのようなラムダを書く方法を扱うことはできません。

+1

あなたは高い再帰の上限を設定している場合でも、あなたはほぼ確実にセグメンテーション違反を得るでしょう、なぜ再帰が必要ですか? –

+0

@PadraicCunninghamコーディングチャレンジ –

+0

ラムダである必要がありますか? –

答えて

3

それはLOGN作ってみましょう:

s=lambda n,lim=1000000: 1 if lim==1 else n+s(0,lim//2)+s(0,lim-(lim//2)) 

print(s(0)) 

あるいは、「A」以外の母音なし:

t=lambda n,l: 1 
v=lambda n,l: n+s(0,l//2)+s(0,l-(l//2)) 
s=lambda n,l=1000000: (t,v)[l!=1](n,l) 
+1

質問のコメントでは、許可される母音は "a"であることが指定されています。これは 'if'を除外し、' else'( 'lim'の名前を変更できる)です。私は 'lim == 1またはn + s(...'、しかし 'or'も許されていません。 – TigerhawkT3

+0

if/elseの代わりにインデックスが動作する可能性があります。 –

-1

使用の分割統治:

add = lambda n,l: l > 1 and add(n,l//2) + add(n+l//2, l-l//2) or n 

PS:このソリューションは、いかなる競争や挑戦にそれを使用することが許可されていないこと、ライセンスの下でリリースされています。派生した作品は、同じライセンスで公開する必要があります。その他の使用方法については、著者の言及を必要とせずに無料です。

+0

?そうでなければ**あなた**は著者を参照していません。 –

+0

@ TadhgMcDonald-Jensen - それは問題ですか? "他の用途には、著者の言及は必要ありません。" SOへの投稿は、競技やチャレンジに参加していません。 – TigerhawkT3

+0

@ TigerhawkT3いいえ、著者が誰であるかわからないと誰も著者を参照することはできますか? –

関連する問題