使用预定义的复合函数在标准ML中写入幂函数

时间:2018-03-03 18:34:31

标签: sml ml mosml

在标准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等。

3 个答案:

答案 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