2009-07-26 23 views

答えて

7

リストではMax functionを探します。これはリストの中で最大の数字を返します。そこから、この値が特定の数よりも小さいかどうかを調べることができます。

+0

ありがとう、良いアイデア。 – Nope

+0

「magicFunction [lst_、val_]:= Max [lst] dreeves

3

試験のこの種の「フォールド」使用して構築することが容易である。

magicFunction[ lst_, val_ ] := 
Fold[ ((#2 < val) && #1) &, True, lst ] 

フレーズ「(#2 <ヴァル)」各リスト要素のテストである(「#2」)。あなたが望むテストをここに置くことができるので、Maxのようなリスト可能な関数よりも強力なテストを行うことができます。

'& &#1'は、現在の要素の結果とすべての以前の要素の結果を結合します。

「True」は基本ケースです。空のリストの結果です。

、それがどのように動作するかを確認するには、いくつかの未定義の値を渡すと、式はに展開ものを見ることができます:私の解決策は私が前の二つのソリューションをコメントしてみましょう提供する前に

In[10]:= magicFunction[ {a, b, c}, 10 ] 

Out[10]= c < 10 && b < 10 && a < 10 
6

。 Joey Robertの解決策magicFunction1とEricの解決策magicFunction2を呼び出します。

magicFunction1は非常に短くエレガントです。私が気に入っていないのは、非常に大きなリストがあり、最初のものがすでに10より大きい場合、必要でない最大の数を計算するすべての作業をやり遂げるということです。

magicFunction3[lst_, val_] := 
Position[# < val & /@ lst, False, 1, 1] == {} 

私は、だから私の最高の答えはmagicFunction4ある

In[1]:= data = Table[RandomInteger[{1, 10}], {10000000}]; 

In[2]:= Timing[magicFunction1[data, 10]] 
Out[2]= {0.017551, False} 

In[2]:= Timing[magicFunction2[data, 10]] 
Out[2]= {10.0173, False} 

In[2]:= Timing[magicFunction3[data, 10]] 
Out[2]= {7.10192, False} 

In[2]:= Timing[magicFunction4[data, 10]] 
Out[2]= {0.402562, False} 

を発見したベンチマークを行う

magicFunction4[lst_, val_] := 
Cases[lst, x_ /; x >= val, 1, 1] == {} 

:これはまた、私は、次の2つのソリューションを開発しmagicFunction2

に適用されます私はまだそれがなぜmagicFunction1よりも遅いのか分からない。私はまた、magicFunction3とmagicFunction4の間に大きなパフォーマンスの違いがある理由を無視します。

+1

MaxのMaximとmagicFunction4のタイミングはMaxが内蔵されている可能性があります....私は本当に確信していません – Nope

+1

実際に測定するための余分なプラス – nes1983

関連する問題