首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建快速指数函数

创建快速指数函数
EN

Stack Overflow用户
提问于 2017-10-15 07:15:49
回答 1查看 885关注 0票数 0

在OCaml中,我很难找到一个更快的典型指数函数版本。以下是我要遵循的一些指导方针:

  1. 与典型的expt b n ==> b * (b * (b ...)递归指数版本不同,该函数接收两个参数b和n,基本上采取分而治之的姿态。
  2. 如果n是偶数,则fastexpt b n => (b ^ (n / 2))^2 else,如果n是奇数,则fastexpt b n => b * (b ^ (n - 1))

下面是我到目前为止编写的代码:

代码语言:javascript
复制
let fastexpt : int -> int -> int
= fun b n ->
    if n = 0 then 1
    else if ((n mod 2) = 0) then (expt b (n / 2)) * (expt b (n / 2)) 
    else b * (expt b (n - 1));;

我的问题是:是否有一种不使用expt函数来编写此函数的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 09:27:13

您在这里所做的是第一次使用divide方法,然后在计算的其余部分使用普通方法(如果考虑到您已经声明了expt)

另一件事是,如果n是奇数,你可以返回b * b^((n-1)/2) * b^((n-1)/2),这就是快速幂运算的目的。

您应该做的只是将fastexpt定义为递归,然后一直使用它:

代码语言:javascript
复制
let rec fastexpt : int -> int -> int
= fun b n ->
    if n = 0 then 1
    else 
      let b2 = fastexpt b (n / 2) in
      if n mod 2 = 0 then b2 * b2 
      else b * b2 * b2;;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46752640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档