我是Java的新手(一般编程,我之前的经验是使用ActionScript 2.0和一些简单的JavaScript),我正在通过Java慢慢地,有条不紊地工作:Herbert Schildt的初学者指南.这是一本令人难以置信的书.
首先,我终于理解了或多或少的位运算符(我在ActionScript 2.0中首次遇到的),并且它们比某些和的其他方法更有效.
我的问题是,是不是更有效地使用,使用,比如说,一个右移,一个方法来执行您的所有部门/ 2(或部门/偶数)与许多计算一个大的程序(在这种情况下,一个庞大的RPG),或者简单地使用标准数学运算是否更有效,因为编译器会为您优化它?
或者,我是否完全提出了错误的问题?
所以,我正在摆弄一些基本的数学,我想要一个函数来在基数之间进行转换.
我写了这个函数:
(define (convert-base from to n)
(let f ([n n])
(if (zero? n)
n
(+ (modulo n to) (* from (f (quotient n to)))))))
Run Code Online (Sandbox Code Playgroud)
这适用于我的所有个人测试<基础10,并且就我所能想象的功能完全正常的测试>基数10,如果我只是添加了对其他数字的支持.
令我感到困惑的是,当我试图使函数尾递归时,我最终得到了这个混乱(我为SO的好处添加了一些间距,因为我的代码通常不清晰或漂亮):
;e.g. 10 2 10 should output 1010, 10 8 64 should output 100 etc.
(define (convert-base-tail from to n)
(let f ([n n]
[acc 0]
[zeros 0])
(begin (printf "n is ~a. acc is ~a. zeros are ~a.\n" n acc zeros)
(cond [(zero? n) (let exp
([x acc]
[shft zeros])
(if (zero? shft) …Run Code Online (Sandbox Code Playgroud)