能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