Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换c++;将公式转换为javascript 学习递归的时候,我尝试在JavaScript中获得一个C++示例函数。_Javascript - Fatal编程技术网

转换c++;将公式转换为javascript 学习递归的时候,我尝试在JavaScript中获得一个C++示例函数。

转换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

原始函数(来自斯坦福CS106B)如下所示:

我下面的版本反复出现的次数太多了。 我把什么基本的事情搞砸了? 我敢打赌这是我的底线 变量一半。。。 我从未尝试过将函数赋值给变量,所以这也是一个新领域

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
类型vs
int
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)