我正在創建一個名為repeat的函式,該函式接收兩個int串列lst1和lst2。假設lst2只有非負整數,根據第二個串列lst2所指示的數字,重復第一個串列lst1中的整數。如果兩個串列都是空的,回傳一個空串列。你可能需要一個本地函式。
舉例:
repeat ([1,2,3], [4,0,3]) -> [1,1,1,3,3]
我在開始使用這個函式時遇到了一點麻煩。我應該在xs后面放什么?
fun repeat(lst1, lst2)=
例子 lst1 of
[] => []
| x::xs' => [] (*這里應該放什么 *)
uj5u.com熱心網友回復:
就像任何遞回問題一樣,你的基本情況是什么?我想說的是,在這種情況下,兩個串列都是空的,它給你一個空串列。
fun repeat([]/span>, []/span>) = []/span>
如果一個是空的而另一個不是呢?這就是一個失敗。讓我們定義一個例外,如果發生這種情況,我們可以拋出。
exception MismatchedArguments;
fun repeat([], []) = [].
| repeat([], _) = raise MismatchedArguments[])= raise MismatchedArguments。
現在真正的問題是我們在剩下的時間里做什么。幸運的是,SML使得我們可以很容易地對兩個串列進行模式匹配并提取它們的第一個元素。
exception MismatchedArguments;
fun repeat([], []) = [].
| repeat([], _) = raise MismatchedArguments[]/span>) = raise MismatchedArguments。
| repeat(x::xs, y::ys) = ...
在這一點上,我們需要一個遞回函式來重復串列中的一個元素一定數量的次數。和整個函式一樣,在這里我們看到了遞回的兩個標志:至少有一個基本的 "退出 "條件,和一個更新步驟,我們通過將n更新為n - 1而向基本條件收斂。
exception MismatchedArguments;
fun repeat([], []) = [].
| repeat([], _) = raise MismatchedArguments[]/span>) = raise MismatchedArguments。
| repeat(x::xs, y::ys) =
let
fun repeat'(_, 0) = []
| 重復'(x, n) = x :: 重復'(x, n - 1)
in
...
結束。
現在,我們只需要把它放在一起,把x和y輸入到repeat',然后把它與再次呼叫repeat的結果連接起來,并輸入xs和ys。通過這樣做,我們向repeat([], [])的基本情況收斂,或者我們可能會向不匹配的情況收斂,在這種情況下會產生MismatchedArguments例外。
exception MismatchedArguments。
fun repeat([], []) = [].
| repeat([], _) = raise MismatchedArguments[]/span>) = raise MismatchedArguments。
| repeat(x::xs, y::ys) =
let
fun repeat'(_, 0) = []
| 重復'(x, n) = x :: 重復'(x, n - 1)
在中
repeat'(x, y) @ repeat(xs, ys)
end
現在repeat([1, 2, 3], [4, 0, 3])將產生[1, 1, 1, 1, 3, 3]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330526.html
標籤:
上一篇:股票基本知識
