我試圖來解決SML多項式評估問題的一個櫃檯,這裏是當前代碼我有:實現在SML
fun eval (nil, b:real) = 0.0
| eval(x::xs, a:real) =
let val y:real = 0.0
fun inc z:real = z+1.0;
in
(x*Math.pow(a,(inc y))) + eval(xs,a)
end;
這裏的問題是,它只是增加Ÿ一次,有沒有讓y從0開始,每次遞歸都增加1?
我試圖來解決SML多項式評估問題的一個櫃檯,這裏是當前代碼我有:實現在SML
fun eval (nil, b:real) = 0.0
| eval(x::xs, a:real) =
let val y:real = 0.0
fun inc z:real = z+1.0;
in
(x*Math.pow(a,(inc y))) + eval(xs,a)
end;
這裏的問題是,它只是增加Ÿ一次,有沒有讓y從0開始,每次遞歸都增加1?
你可以通過使用本地函數(或幫助函數)的概念來做到這一點。下面的代碼:
local
fun helper(nil,b:real,_)=0.0
|helper(x::xt,b:real,y)=(x*(Math.pow(b,(y)))) + helper(xt,b:real,y+1.0)
in
fun eval(x,a:real)= helper(x,a,0.0)
end
我希望這能解決你的問題:)
y
被設置在函數內部let
表達爲0,所以每次調用該函數它的值爲0 。如果你想爲設置不同的值,以便調用eval
函數,那麼你應該使它成爲該函數的一個參數。
如果xs
應該是遞增的順序係數:
fun eval'(nil, a, n) = 0.0
| eval'(x::xs, a, n) = x*Math.pow(a, n) + eval'(xs, a, n + 1.0)
fun eval(xs, a) = eval'(xs, a, 0.0)
或者,由於a
是整個遞歸實際上常數:
fun eval(xs, a) =
let
fun eval'(nil, n) = 0.0
| eval'(x::xs, n) = x*Math.pow(a, n) + eval'(xs, n + 1.0)
in
eval'(xs, 0.0)
end
或者,如果你不想寫遞歸你自己:
fun eval(xs, a) = foldl (fn(x, (s, n)) => (x*Math.pow(a, n) + s, n + 1.0)) (0.0, 0.0) xs
謝謝噸:)這正是我是我爲了保持通過相同的參數 – AuthenticReplica 2012-03-12 22:06:32
@TarekMerachli My Pleasure :) – atuljangra 2012-03-12 22:11:07