【发布时间】:2017-04-09 16:49:10
【问题描述】:
所以,我尝试实现我自己的 ModExp 实现(我知道我应该使用现有的,但这是学校的任务)并且在使用大数字时出现堆栈溢出 (>= 2^1024)
modExp :: Integer -> Integer -> Integer -> Integer
modExp x y m
| y == 0 = 1
| y `mod` 2 == 0 = modExp ((x ^ 2) `mod` m) (y `div` 2) m
| otherwise = x * modExp x (y - 1) m `mod` m
有什么问题?听说必须使用尾递归来避免堆栈溢出,但是这里我有两种情况必须调用递归。我该如何解决?
【问题讨论】:
-
摆脱非尾递归的常用技巧是强制将您需要对函数结果执行的任何操作推到函数本身。在您的情况下,您需要将结果乘以 x,因此添加一个额外的参数并将您的因子传递给它。内部相乘,但在递归调用之前。