我想寫一個函式,它接受一個 List [a_n; a_n-1; ...; a_0] 帶累加器 acc。
該函式應該計算整個串列中每個元素的 i 次冪的總和。該函式fold_left會給 f 一個整數。公式是acc sum 從i=0 到a_i ^ i 的n。我的問題是在fold_left:
let fold_left f acc l =
match l with
| [] -> acc
| x::xs -> fold_left f (f x acc) xs
累加器總是回傳一個整數 - 所以我沒有參考來知道第 i 個元素是什么數字。
所以我的問題是我應該如何構建我的 f 函式。
f 的結構應該是這樣的:
f a_0 (f a_1(...(f a_n acc)...))
我嘗試了一種命令式方法,使用一個 ref 變數來存盤 f 迄今為止計算出的先前值。但我確定這個問題有更好的解決方案......
uj5u.com熱心網友回復:
累加器不需要是整數,可以是元組,也可以是記錄
type 'a acc = { pos:int; acc:'a }
uj5u.com熱心網友回復:
您可以使用帶有兩個元素的元組作為累加器:
# let f (s, i) x =
(s pow x i, i 1);;
val f : int * int -> int -> int * int = <fun>
# let sum_powers_left l = fst (List.fold_left f (0, 0) l);;
val sum_powers_left : int list -> int = <fun>
# let g x (s, i) =
(s pow x i, i 1);;
val g : int -> int * int -> int * int = <fun>
# let sum_powers_right l = fst (List.fold_right g l (0, 0));;
val sum_powers_right : int list -> int = <fun>
# sum_powers_left [2000; 100; 20; 3];; (* 1 100 20*20 3*3*3 *)
- : int = 528
# sum_powers_right [2000; 100; 20; 3];; (* 2000*2000*2000 100*100 20 1 *)
- : int = 8000010021
其中pow x i計算為x的冪i。遺憾的是它不在標準庫中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/378937.html
上一篇:如何遞回遍歷陣列并替換某些值?
下一篇:在類中封裝引數和引數
