在标准Ml中编写电源功能时遇到问题。我正在尝试编写一个名为exp
的函数int -> int -> int
。
非负exp b e
的应用e
应返回b^e
。
例如,exp 3 2
应该返回9. exp
必须使用下面提供的函数compound
来实现。 exp
不应该直接调用自己。以下是compound
函数,它包含值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等。
答案 0 :(得分:4)
你非常接近。您对exp
化合物fn x => x*x
的定义(正如您所注意到的)不是您想要的,因为它反复对输入求平方。相反,您希望通过基础重复乘法。也就是fn x => b*x
。
接下来,您可以实际删除e = 0
的特殊情况,依据compound
“在被要求应用函数0次时做正确的事情。
fun exp b e = compound e (fn x => b*x) 1
答案 1 :(得分:2)
你可以这样做而不是我相信
fun exp 0 0 = 1
| exp b 0 = 1
| exp b e = (compound (e - 1) (fn x => b * x ) b);
答案 2 :(得分:0)
这可能不是100%正确的代码。我刚刚读了一些标准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