簡體   English   中英

使用嵌套函數查找數字積

[英]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則將它們丟棄會更有效。您可以在其中做兩件事除此之外,

  1. 使函數尾部遞歸,以便使用更少的堆棧空間。

  2. 將迭代/折疊概括為通用模式。

例如,

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.

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