0

我希望我的函数使用递归打印总和

function sumOf(num){
        if(num == 1 ) return 1;
         console.log("we are seeing decrement",num--)
        return num + sumOf(num--);
    }
    console.log(sumOf(6))

输出:-

we are seeing decrement 6
we are seeing decrement 5
we are seeing decrement 4
we are seeing decrement 3
we are seeing decrement 2
16

我得到错误的输出为什么?

正确输出:- 21

function sumOf(num){
    if(num == 1 ) return 1;
    return num + sumOf(num--);
}
console.log(sumOf(6))

输出:-

RangeError: Maximum call stack size exceeded
     at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)
        at sumOf (C:\Users\mdvenkat\Desktop\dataStructures and algortherms\recurssion_2.js:4:18)

为什么现在我收到 RangeError ,日志语句和递归之间是否有任何链接

注意:-我知道如果我们将 num-- 更改为 num-1 它将起作用,但我想要以下错误的原因(相同的代码,但只删除了控制台日志)

4

3 回答 3

1

嗯,它按预期工作。

function sumOf(num){
        if(num == 1 ) return 1;
         console.log("we are seeing decrement",num--)
        return num + sumOf(num--);
    }
    console.log(sumOf(6))

它不起作用的情况是你打电话的时候sumOf(num--)

它的工作原理是这样的:首先num返回然后递减。所以它一直6递归调用。6 永远不会从堆栈中清除。

//sumOf(6) //doesn't matter what you do with num-- now, sumOf(6) has already been called
//calls sum(6) again due to the previous execution
//calls sumOf(6) again and it keeps happening ...

你用控制台做的是你用num--. 因此,如果您只是这样做,那也将起作用。

    function sumOf(num){
            if(num == 1 )return 1;
             num--;
             return num + sumOf(num);
            
        }
        console.log(sumOf(6))

于 2020-06-14T07:19:13.910 回答
1

像这样更改您的代码。您正在使用后减运算符,否则使用前减运算符

function sumOf(num){
    if(num === 1 ) return 1;
    return num + sumOf(--num);
}
console.log(sumOf(6))
于 2020-06-14T07:20:34.160 回答
0

它产生差异的原因是因为 n-- (与 --n 或 n-1 不同)在递减之前返回值。

如果使用后缀,操作数后面有运算符(例如,x--),减量运算符减量并返回减量前的值。

来源: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Decrement

于 2020-06-14T07:32:26.123 回答