递归的方式重写阶乘的函数,寻找喇叭花数的循环时报错

递归的方式重写阶乘的函数,寻找喇叭花数的循环时报错

我用递归的方式重写阶乘的函数,再套用寻找喇叭花数的循环,浏览器就会报错,请问是什么原因?

// function factorial(num) {

//     let result = 1;

//     for (let i = num; i > 1; i--) {

//         result *= i;

//     }

//     return result;

// }


function factorial(num) {

if (num == 1) return 1;

return num * factorial(num - 1);

}



for (let i = 100; i <= 999; i++) {

let a = parseInt(i / 100);

let b = parseInt(i / 10) % 10;

let c = i % 10;

if (i == factorial(a) + factorial(b) + factorial(c)) console.log(i);

}


chrome 报错如下:

test.html:22 Uncaught RangeError: Maximum call stack size exceeded

    at factorial (test.html:22:13)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)

    at factorial (test.html:23:26)


指向的是  if (num == 1) return 1; 这行代码。


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,很抱歉之前老师回答的有问题。

递归代码需要考虑到0的情况,这段代码中没有0的判断,所以会导致报错:超过最大调用堆栈大小

https://img1.sycdn.imooc.com//climg/61de3fa309b1ec7a03370174.jpg

加一个0的判断即可,如下:

https://img1.sycdn.imooc.com//climg/61de3fe10906b4c905110242.jpg

https://img1.sycdn.imooc.com//climg/61de3fe8099719cd01080033.jpg

自己再测试下。

好帮手慕慕子 2022-01-11 10:12:10

同学你好,报错是因为代码陷入了死循环,应该是满足每个数位的数字的立方和等于它本身的三位数表示一个水仙花数,这里不需要使用阶乘函数,直接使用for循环遍历结合if判断就可以了。

https://img1.sycdn.imooc.com//climg/61dce7280955e0fc09490427.jpg

祝学习愉快~

  • 提问者 慕前端0538480 #1

    不是寻找水仙花数,而是寻找喇叭花数需要用到阶乘。

    如果用开头被注释掉的那段 for 循环 构造阶乘就可以实现查找,

    function factorial(num) {

        let result = 1;

        for (let i = num; i > 1; i--) {

         result *= i;

        }

         return result;

    }

    for (let i = 100; i <= 999; i++) {

    let a = parseInt(i / 100);

    let b = parseInt(i / 10) % 10;

    let c = i % 10;

    if (i == factorial(a) + factorial(b) + factorial(c)) console.log(i);

    }

    也就是课程中提到的方式。

    但是在后面学到递归后,用递归方式重构阶乘,

    function factorial(num) {

    if (num == 1) return 1;

    return num * factorial(num - 1);

    }

    每个数字的阶乘结果是正确的,

    但是带入原来的寻找喇叭花数的函数,就会造成浏览器的崩溃。



    2022-01-11 20:50:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师