2011-01-20 16 views
1

嗨 我有一個數字列表,例如k_1,k_2,... k_n,f是一個函數。 現在我在數字列表上應用f,我需要這些數字,例如f增加,如何把結果放在mathematica的表或數組中?

f(k_i)>f(k_j) for any i>j . 

我能得到的結果數K_I是在每一個不同的行,但我需要用逗號或別的東西和計數結果的數量分開在一個表中的結果。

例如:

k = Table[k1, k2, k3, k4, k5, k6, k7, k8, k9, k10]; 
count = 0; 
i=1; 
For[j = i, j <= 10, j++, 
    If[f[k[[j]]] - f[k[[i]]] > 0, i = j; Print["k", i]; 
    count = count + 1]]; 
Print["count= ", count] 

我喜歡的結果:

k2 
k3 
k5 
k9 
count=4 

,但我需要的結果是在一起:

{k2,k3,k5,k9} 
count=4 

什麼想法?

感謝

回答

2

相反的Print,你可以做AppendTo,即

list={};AppendTo[list,5]

這可能是很好的開始學習函數式編程方法,因爲數學有工具,使之有效,你上面的代碼可能看起來像這樣

pairs = Partition[list, 2, 1]; 
increasingPairs = Select[pairs, f[First[#]] < f[Last[#]] &]; 
Last /@ increasingPairs 
+0

輸入列表= {5,3,6,1,5,7}返回{5,6} ... – 2011-01-20 12:54:20

2

你似乎t o想要最長的子序列。我知道得到它在數學中最簡單,最有效的方法是:

lis[f_, vals_List] := LongestCommonSequence[#, Sort[#]] &[Map[f, vals]]; 

例子:

In[8]:= lis[# &, {5, 3, 6, 1, 5, 7}] 

Out[8]= {5, 6, 7} 

原則,答案不是唯一的 - 可能有幾個不同的時間最長增加相同長度的子序列。