簡體   English   中英

從命令式編程轉換為函數式編程[Python到標准ML]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM