【问题标题】:(Scheme) Tail recursive modular exponentiation(方案)尾递归模幂
【发布时间】:2019-03-09 05:01:27
【问题描述】:

我有一个任务要创建一个尾递归函数,该函数需要 3 个整数(可能非常大)p q 和 r,并计算除法的模数 (p^q)/r。我想出了如何做一个实现目标的函数,但它不是尾递归的。

(define (mod-exp p q r)
  (if (= 0 p)
      0
      (if (= 0 q)
          1
          (if (= 0 (remainder r 2))
              (remainder (* (mod-exp p (quotient q 2) r)
                            (mod-exp p (quotient q 2) r))
                         r)
              (remainder (* (remainder p r)
                            (remainder (mod-exp p (- q 1) r) r))
                         r)))))

我很难把我的头包起来做这个尾递归,我不知道如何“累积”剩余部分。 对于这项任务,我几乎只能使用基本的数学运算符以及商和余数。

【问题讨论】:

  • 从尾递归“正则”幂运算开始,然后酌情添加remainder。 (您需要添加一个累积参数。)

标签: recursion scheme modulo tail-recursion modular-arithmetic


【解决方案1】:

我看到您正在实现二进制求幂,并具有减少 mod r 的额外功能。

您可能想要做的是采用普通(尾递归)二进制求幂算法,只需将 2 元函数 + 和 * 更改为您自己的用户定义的 3 元函数 +/mod 和 */mode,它们也需要r 并在返回结果之前减少结果 mod r。

现在你如何以尾递归的方式进行二进制取幂?您需要 main 函数调用一个辅助函数,该函数接受一个额外的累加器参数 - 初始值 1。这有点类似于使用辅助函数 REVAPPEND 的尾递归 REVERSE - 如果您熟悉的话。

希望对您有所帮助,如果您需要更多信息,请随时询问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2011-07-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多