Sml 使用预定义的复合函数在标准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);

编写幂函数inStandard Ml时遇到问题。我正在尝试编写一个名为
exp
的函数,类型为
int->int->int

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

例如,
exp3 2
应该返回9
exp
必须使用下面提供的函数
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
时的特殊情况,使最终代码非常优雅。