能somewone帮我转换这个方案功能:递归迭代 - 计划到C
#lang racket
(define (powmod2 x e m)
(define xsqrm (remainder (* x x) m))
(cond [(= e 0) 1]
[(even? e) (powmod2 xsqrm (/ e 2) m)]
[(odd? e) (remainder (* x (powmod2 xsqrm (/ (sub1 e) 2) m)) m)]))
进入C中的函数,并且不使用递归即使用迭代。
我不知道',困扰我的部分是当e很奇怪,然后递归调用在余数函数中。我不知道如何在一个while循环中传输它?任何提示或建议:
这是我迄今为止:因为代码已被写入尾递归
int powmod2(int x, int e, int m) {
int i = x;
int xsqrm = ((x * x) % m);
while (e != 0){
if (e%2 == 0) {
x = xsqrm;
e = (e/2);
xsqrm = ((x * x) % m);
}
else {
i = x;
x = xsqrm;
e = (e - 1)/2;
xsqrm = ((x * x) % m);
}
}
e = 1;
return (i*e)%m;
}
因此,让一个辅助函数,它的“(余数(* x(powmod2 xsqrm(/(sub1e)2)m))m)”部分?使用迭代? – Thatdude1 2012-01-27 22:00:01
不,您需要修改powmod2本身,并使用助手来启动它,就像我的例子。 (也许还有其他的方法可以解决这个简单的问题,但是你并不是真的在做直接翻译) – hugomg 2012-01-27 22:25:18