2017-07-30 44 views
2

考慮一個「轉到」陣列,其中每個元素告訴你下一個輸入跳轉到:如果我們開始在索引0動態如果「權力」,它收集結果

a=. 1 3 3 6 10 7 10 9 15 12 

因此,值1,意思是「去索引1」。當我們這樣做時,值是3,這意味着「去索引3」。那裏的值是6,所以我們跳到索引6,其中值爲10.此時我們停止,因爲索引10超出了界限。如果我們收集我們的結果,我們會得到:

0 1 3 6 10 

而事實上,我們可以做到這一點使用^:和陣列功率:

a {~^:(i.5) 0  NB. returns 0 1 3 6 10 

的問題是,我不得不提前知道我需要多少次迭代。

相反,我想用u^:v y形式用布爾返回v(它可以檢查列表的長度已經超過了) - 但我也喜歡收集結果。

這可能嗎?

事情變得冗長很快,如果你正在做手工該集合與,,雖然漂亮的手工如果沒有內置的方式做我想做的收集解決方案就足夠了。

完全不同的方法,實現相同的目標也是受歡迎的。

+0

使用'一:直到他們收斂'將收集所有的結果。 – miles

+0

@miles在這種情況下,如果沒有明確的停止條件,他們將不會收斂,它會繼續下去,直到它給出索引錯誤 – Jonah

+0

您也可以使用do-while循環,例如'u ^:v ^:a:' 'v'是有條件的。這將在循環的每次迭代中收集結果。 – miles

回答

4

如上所示,您可以使用a:返回中間迭代的結果。它將繼續迭代,直到它連續兩次得到相同的結果。下面的代碼將導致動詞在第一次遇到無效索引時暫停。這是通過使用連接adverse::捕獲錯誤,然後再次返回相同的正確參數來完成的。

a {~ ::]^:a: 0 
0 1 3 6 10 
+0

正是我所希望的,ty Tikkanz。 – Jonah

+0

@Tikkanz你可否詳細說明'^:a:'還是至少鏈接到解釋它的東西? – Dane

+0

如http://code.jsoftware.com/wiki/Vocabulary/hatco#Boxed_Numeric_n_--_decoding_variable-length_records – Dane