(方案)尾递归模块化求幂

时间:2018-10-03 21:28:27

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

我有一个任务要做一个尾递归函数,该函数采用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)))))

我很难把头绕到尾部递归上,我看不到如何“积聚”余数。 我几乎只能使用基本的数学运算符以及商和余数来完成此任务。

1 个答案:

答案 0 :(得分:0)

我看到您正在实现二进制幂运算,其附加功能是减少了mod r。

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

现在如何以尾部递归的方式进行二进制求幂?您需要主函数调用一个需要额外的累加器参数的辅助函数-初始值1。如果您熟悉此函数,则类似于使用辅助函数REVAPPEND的尾递归REVERSE。

希望能帮助您并且随时询问您是否需要更多信息。