定義一個函數,給定一個列表L,一個對象x和一個正數 整數k返回x中第x次出現的位置,如果x例如,如果L是 [#「a」,#「b」,#「c」,#「b」],x是#「b」,並且k是2,那麼函數 返回4.返回列表中的位置(ML)
對於這個問題,我不能使用任何輔助函數,也不能使用長度函數。關於如何解決它的任何想法?
定義一個函數,給定一個列表L,一個對象x和一個正數 整數k返回x中第x次出現的位置,如果x例如,如果L是 [#「a」,#「b」,#「c」,#「b」],x是#「b」,並且k是2,那麼函數 返回4.返回列表中的位置(ML)
對於這個問題,我不能使用任何輔助函數,也不能使用長度函數。關於如何解決它的任何想法?
假設find
是你必須實現的功能。兩件事情是直接從該描述:
find
返回一個整數find
至少需要三個參數(L
,x
和k
)此外,在列表的函數通常兩個區分情況:給定列表爲空([]
)或者它至少包含一個元素(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
並且最後,當我們發現發生並且k
是1
在同一時間,我們發現期望的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
其餘的情況是,我們發現的x
的k
個發生。所以我們應該返回這個事件的索引i
。但是我們應該從哪裏得到i
?在某種程度上,我們必須在函數內部進行計算。如何做到這一點,是爲了找出答案。
通過編寫一個返回第一個匹配項的位置的函數(如果有的話)來練習。然後擴展這個想法。 – molbdnilo