使用嵌套函数查找数字的乘积

时间:2016-09-01 14:56:20

标签: function functional-programming nested sml

我需要创建一个给定自然数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

2 个答案:

答案 0 :(得分:2)

从问题本身(某些类中的练习的一部分?)不清楚我们应该如何使用嵌套函数,因为有办法编写没有嵌套的函数,例如

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 :(得分:2)

使用标准库,产生数字的函数[1; 名词 -1],

Python

删除可被2或3整除的数字的函数,

fun below n = List.tabulate (n-1, fn i => i+1);

计算其输入产品的函数

val filter23 = List.filter (fn i => i mod 2 <> 0 andalso i mod 3 <> 0)

并将它们粘在一起,

val product = List.foldl op* 1

这将生成一个列表,对其进行过滤并将其折叠。这浪费了比必要更多的内存。做@FPstudent和@coder做和生成数字并立即将它们作为最终产品的一部分会更有效,或者如果它们可以被2或3整除则扔掉它们。你可以做两件事除此之外,

  1. 使函数tail-recursive,因此它使用更少的堆栈空间。

  2. 将迭代/折叠概括为通用模式。

  3. 例如,

    val f = product o filter23 o below
    

    这类似于Python's xrange