[英]How to compute sum, average and product of three numbers using different functions
[英]Using nested functions to find product of numbers
我需要制作一個給定自然數n的函數,計算n以下的數字的乘積,該數字不能被2或3整除,在如何使用嵌套函數上感到困惑,以便解決此問題(sml也是新的)到目前為止我的代碼是
fun countdown(x : int) =
if x=0
then []
else x :: countdown(x-1)
fun check(countdown : int list) =
if null countdown
then 0
else
從問題本身(某個類的練習的一部分?)中尚不清楚,我們應該如何使用嵌套函數,因為存在不嵌套的編寫函數的方法,例如
fun p1 n =
if n = 1 then 1 else
let val m = n - 1
in (if m mod 2 = 0 orelse m mod 3 = 0 then 1 else m) * p1 m
end
還有很多使用嵌套函數編寫它的方法,例如
fun p2 n =
if n = 1 then 1 else
let val m = n - 1
fun check m = (m mod 2 = 0 orelse m mod 3 = 0)
in (if check m then 1 else m) * p2 m
end
要么
fun p3 n =
let fun check m = (m mod 2 = 0 orelse m mod 3 = 0)
fun loop m =
if m = n then 1 else
(if check m then 1 else m) * loop (m + 1)
in loop 1
end
或像@coder以前的答案一樣,僅舉幾個例子。 其中p3
有點特殊,因為內部函數loop
具有“自由變量” n
,它表示外部p3
的參數。
使用標准庫,該函數可產生數字[1; n -1],
fun below n = List.tabulate (n-1, fn i => i+1);
刪除被2或3整除的數字的函數,
val filter23 = List.filter (fn i => i mod 2 <> 0 andalso i mod 3 <> 0)
一個計算輸入乘積的函數,
val product = List.foldl op* 1
並把它們粘在一起,
val f = product o filter23 o below
這將生成一個列表,對其進行過濾並將其折疊。 這浪費了不必要的內存。 進行@FPstudent和@coder的操作並生成數字,然后立即將它們作為最終產品的一部分,或者將它們除以2或3則將它們丟棄會更有效。您可以在其中做兩件事除此之外,
使函數尾部遞歸,以便使用更少的堆棧空間。
將迭代/折疊概括為通用模式。
例如,
fun folditer f e i j =
if i < j
then folditer f (f (i, e)) (i+1) j
else e
fun accept i = i mod 2 <> 0 andalso i mod 3 <> 0
val f = folditer (fn (i, acc) => if accept i then i*acc else acc) 1 1
這類似於Python的xrange 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.