2

在标准 Ml 中编写幂函数时遇到问题。我正在尝试编写一个名为exptype的函数int -> int -> int

应用程序exp b e,对于非负数e,应该返回b^e

例如,exp 3 2应该返回 9。exp必须使用compound下面提供的函数来实现。exp不应该直接调用自己。这是compound函数,它接受一个值n、一个函数和一个值x。它所做的只是将函数应用于值 xn 次。

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 等。

4

3 回答 3

4

你非常接近。您对exp化合物的定义fn x => x*x(正如您所注意到的)不是您想要的,因为它反复平方输入。相反,您希望重复乘以 base。即,fn x => b*x

接下来,您实际上可以通过在被要求应用函数 0 次时“做正确的事”e = 0这一事实来消除特殊情况。compound

fun exp b e = compound e (fn x => b*x) 1
于 2018-03-03T19:23:59.697 回答
2

我相信你可以这样做

  fun exp 0 0 = 1
  | exp b 0 = 1
  | exp b e = (compound (e - 1) (fn x => b * x ) b); 
于 2018-03-03T20:27:22.400 回答
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
于 2018-03-03T18:46:21.190 回答