我需要创建一个给定自然数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
答案 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整除则扔掉它们。你可以做两件事除此之外,
使函数tail-recursive,因此它使用更少的堆栈空间。
将迭代/折叠概括为通用模式。
例如,
val f = product o filter23 o below
这类似于Python's xrange。