转换c++;将公式转换为javascript 学习递归的时候,我尝试在JavaScript中获得一个C++示例函数。
原始函数(来自斯坦福CS106B)如下所示: 我下面的版本反复出现的次数太多了。 我把什么基本的事情搞砸了? 我敢打赌这是我的底线 变量一半。。。 我从未尝试过将函数赋值给变量,所以这也是一个新领域转换c++;将公式转换为javascript 学习递归的时候,我尝试在JavaScript中获得一个C++示例函数。,javascript,Javascript,原始函数(来自斯坦福CS106B)如下所示: 我下面的版本反复出现的次数太多了。 我把什么基本的事情搞砸了? 我敢打赌这是我的底线 变量一半。。。 我从未尝试过将函数赋值给变量,所以这也是一个新领域 function Raise (base, expo) { if (expo === 0) return 1; else { var half = Raise(base, (expo/2)); if (expo % 2
function Raise (base, expo)
{
if (expo === 0)
return 1;
else
{
var half = Raise(base, (expo/2));
if (expo % 2 === 0)
return half * half;
else
return base * half * half;
}
}
Raise(3,5);
JavaScript没有整数除法,因此此行:
var half = Raise(base, (expo/2));
在JavaScript中不做与C++中相应的行相同的事情。(例如,如果
expo===5
,则第二个参数的递归值为2.5
,而不是预期的2。)如果使用
运算符,则可以获得与整数除以2相同的效果:
var half = Raise(base, expo >> 1);
另外,我应该提到,在一般情况下,你可以使用整数除法(或者如果分子和分母有相反的符号)。位级运算符还可以在必要时将其参数转换为整数,因此可以使用((a/b)| 0)
获取商a/b
的整数部分。这样你就不用担心信号了
p.p.S.使用起来可能会快一点
if ((expo & 1) === 0)
而不是
if (expo % 2 === 0)
测试
expo
是否为偶数。(C++代码类似的事情) 1,把我打败。我当时正在写一篇关于Raise
的长篇大论,需要对其进行深入分析,JS的number
类型vsint
,double
和float
啊-令人尴尬-在我做了所有其他练习之后,我应该知道javascript没有整数除法。谢谢以防万一OP/其他人没有被2除法:记住Math.floor()
向负无穷大进发,这可能是一个意外的结果。例如:Math.floor(5/2)
evals到2
,而Math.floor(-5/2)
evals到-3
!如果您是在“更常规”的四舍五入之后接近零,您可以使用~~(5/2)
或(5/2)>>0
;两者看起来都很酷:)@o.v.-这就是我的P.S.的内容,但我把它扩展到包括你的观点。如果除法的分子和分母具有相反的符号,则商将为负数,Math.ceil
随后将截断(向+无穷大舍入,也将根据需要向0舍入)。比特技巧(~
,>0
,|0
等)也会让随意阅读代码的人感到非常困惑。
if (expo % 2 === 0)