2013-09-23 42 views
0

定義一個函數,給定一個列表L,一個對象x和一個正數 整數k返回x中第x次出現的位置,如果x例如,如果L是 [#「a」,#「b」,#「c」,#「b」],x是#「b」,並且k是2,那麼函數 返回4.返回列表中的位置(ML)

對於這個問題,我不能使用任何輔助函數,也不能使用長度函數。關於如何解決它的任何想法?

+4

通過編寫一個返回第一個匹配項的位置的函數(如果有的話)來練習。然後擴展這個想法。 – molbdnilo

回答

2

假設find是你必須實現的功能。兩件事情是直接從該描述:

  • find返回一個整數
  • find至少需要三個參數(Lxk

此外,在列表的函數通常兩個區分情況:給定列表爲空([])或者它至少包含一個元素(y::ys)。因此,我們可以使用下面的骨架爲find

fun find [] x k = ... 
    | find (y::ys) x k = ... 

你應該考慮在這兩種情況下該怎麼做啓動。如果L爲空,那麼肯定不會出現x,因此結果爲0。否則,L由頭元件y和其餘列表ys組成。如果x等於y,我們只是發現了x,否則我們不得不繼續在ys中進行搜索。據此,骨架可提煉成

fun find [] x k = 0 
    | find (y::ys) x k = 
     if x = y then ... 
     else find ys x k 

此時僅存的部分是,當L不爲空和x = y。但由於我們對k發生x感興趣,我們必須檢查我們是否找到它。這可以通過每當我們發現x發生時減少k並且最後,當我們發現發生並且k1在同一時間,我們發現期望的k-發生x

fun find [] x k = 0 
    | find (y::ys) x k = 
     if x = y andalso k > 1 then find ys x (k - 1) 
     else if x = y then ... 
     else find ys x k 

其餘的情況是,我們發現的xk個發生。所以我們應該返回這個事件的索引i。但是我們應該從哪裏得到i?在某種程度上,我們必須在函數內部進行計算。如何做到這一點,是爲了找出答案。