Sml 使用预定义的复合函数在标准ML中编写幂函数
编写幂函数inStandard Ml时遇到问题。我正在尝试编写一个名为Sml 使用预定义的复合函数在标准ML中编写幂函数,sml,ml,mosml,Sml,Ml,Mosml,编写幂函数inStandard Ml时遇到问题。我正在尝试编写一个名为exp的函数,类型为int->int->int 对于非负的e,应用程序exp b e应返回b^e 例如,exp3 2应该返回9exp必须使用下面提供的函数composite来实现exp不应直接调用自身。这是复合函数,它接受一个值n、一个函数和一个值x。它所做的只是将函数应用于x n值的次数 fun compound 0 f x = x | compound n f x = compound (n-1) f (f x);
exp
的函数,类型为int->int->int
对于非负的e
,应用程序exp b e
应返回b^e
例如,exp3 2
应该返回9exp
必须使用下面提供的函数composite
来实现exp
不应直接调用自身。这是复合
函数,它接受一个值n
、一个函数和一个值x
。它所做的只是将函数应用于x n值的次数
fun compound 0 f x = x
| compound n f x = compound (n-1) f (f x);
我很难弄清楚如何在没有递归的情况下编写这个函数,而且必须使用一个只能使用一个参数的函数。有人知道从哪里开始吗
这就是我所拥有的:
fun exp b 0 = 1
| exp b e = (compound e (fn x => x*x) b)
我知道这不起作用,因为如果我输入2^5,它会起作用:
2*2、4*4、16*16等。这可能不是完全正确的代码。我刚才读了一些标准的ML文档,并为您的示例编写了一些代码并进行了修改,但对于大多数编程语言来说,总体思路是相同的
fun foo (num, power) =
let
val counter = ref power
val total = 1
in
while !counter > 0 do (
total := !total * num
counter := !counter - 1
)
end;
为了更清楚地了解一些伪代码:
input x, pow
total = 1
loop from 1 to pow
total = total * x
end loop
return total
这不处理负指数,但它应该让你开始
它基本上是一个简单的算法,用来说明指数的真正含义:重复乘法
2^4 = 1*2*2*2*2 //The 1 is implicit
2^0 = 1
你非常接近。您对
exp
复合fn x=>x*x
的定义(正如您所注意到的)不是您想要的,因为它重复地平方输入。相反,您希望按基数进行重复乘法。也就是说,fnx=>b*x
接下来,当被要求应用函数0次时,component
“做正确的事情”,通过这一事实,您实际上可以删除e=0
的特例
fun exp b e = compound e (fn x => b*x) 1
我相信你可以这样做
fun exp 0 0 = 1
| exp b 0 = 1
| exp b e = (compound (e - 1) (fn x => b * x ) b);
OP要求一个人使用上面列出的
复合
函数。我遇到的主要问题是如何保持原始的基数b并将其用于乘法。我觉得我必须使用多个调用来合成,但不确定如何实现。我也这么想。基本上把乘法分解为加法。2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2. 3^5=3*3*3*3*3*3=3+3…+3不幸的是,我必须走出来,所以我不能继续研究这个问题,但希望它能给你一个想法,composite
递归地调用它自己。。。我对问题进行了编辑,以使其符合您的意思。函数component允许递归,但函数exp不允许递归。我是否会向component发送一个元组,以便将基数和x的值都发送给它?基数不会随着迭代而变化,因此不需要!只需完全按照我在答案中所做的那样编写函数就可以了。要了解更多信息,您可能有兴趣阅读。这是一件有意义的小事!非常感谢。没问题。我还用一个解决方案编辑了答案,该解决方案消除了e=0
时的特殊情况,使最终代码非常优雅。