[英]Conversion from imperative to functional programming [Python to Standard ML]
我有一個函數規范,聲明它應該評估一個變量的多項式函數。 函數系數以列表形式給出。 它還接受變量的值作為實數。
例如:eval(2,[4,3,2,1])= 26(1 * x ^ 3 + 2 * x ^ 2 + 3 * x ^ 1 + 4 * x ^ 0,其中x = 2)
這是python中的函數,但我不確定如何將其轉換為SML。 我無法找到一種方法來傳遞迭代值,而無需更改函數的參數。 它需要保持真正的真實列表 - >真正的功能。
def eval(r, L):
sum = 0
for i in range(0, len(L)):
sum = sum + L[i] * (r ** i)
return sum
在函數式語言中表達總和的通常方法是折疊。 你可以通過在每次迭代中將sum乘以r來擺脫索引(以及將int提升到另一個int的冪的函數)的需要:
fun eval radix lst = let
fun f (element, sum) = sum * radix + element
in
foldr f 0 lst
end
現在這個函數可以像這樣使用:
- eval 10 [1,2,3];
val it = 321 : int
您可以使用顯式遞歸來遍歷系數列表,對基數取冪,並總計總和。
fun eval r =
let fun step (power, sum) (coeff :: rest) =
step (power * r, sum + coeff * power) rest
| step (_, sum) nil = sum
in step (1, 0)
end
在結構上,這就像折疊一樣,如果我們用一個替換它就會變得更清晰。
fun eval r lst =
let fun step (coeff, (power, sum)) = (power * r, sum + coeff * power)
val (_, sum) = foldl step (1, 0) lst
in sum
end
你可以顛倒操作的順序來使用Horner的方案,正如KennyTM的評論中提到的那樣:這將導致sepp2k的答案,這需要一半的乘法,但使用更多的堆棧空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.