【问题标题】:"Maximum call stack size exceeded" Calling function from inside the function“超出最大调用堆栈大小”从函数内部调用函数
【发布时间】:2017-10-18 11:18:32
【问题描述】:

好的,所以我正在尝试制作一个小型数独生成器,但在遇到问题之前我并没有走多远。当 console.log 中的输出为“a == b”时,我遇到错误“超出最大调用堆栈大小”。这是我的代码(我不是经验丰富的编码器 FUI)

function en_Til_Ni() {
    return Math.floor(Math.random()*9)+1;
} 

var enTilNi = en_Til_Ni(); 
console.log(enTilNi);

var a = en_Til_Ni();
console.log("a" + a);
var b = en_Til_Ni();
console.log("b" + b);
var c = en_Til_Ni();
console.log("c" + c);


console.log("---------------------------------------------");

function ikkeLike() { //this is where it goes wrong
    if (a != b) {
        console.log(a, b);
    }

    else if (a == b) { // It logs the numbers just fine, untill a == b
        ikkeLike();
    }

}

ikkeLike();

【问题讨论】:

  • 因为当a==b 时,发布ab 的值不会改变。因此永远不会达到退出条件。
  • 顺便说一句,递归对于您的用例来说相对昂贵;如果在运行时之前结果未知,您可能希望使用 while 进行调查。

标签: javascript function loops if-statement


【解决方案1】:

你当然会得到这个结果,因为你没有工作退出条件。

您需要更改随机值并再次检查,直到达到想要的状态。

function en_Til_Ni() {
    return Math.floor(Math.random() * 9) + 1;
}

function ikkeLike() {
    a = en_Til_Ni();
    b = en_Til_Ni();
    if (a !== b) {
        console.log(a, b);
    } else {              // no need for the opposite check
        ikkeLike();
    }
}

var a, b;                 // global variables
ikkeLike();

没有递归调用和do ... while 循环的更好版本。

function en_Til_Ni() {
    return Math.floor(Math.random() * 9) + 1;
}

function ikkeLike() {
    do {
        a = en_Til_Ni();
        b = en_Til_Ni();
    } while (a === b)
    console.log(a, b);
}

var a, b; // global variables
ikkeLike();

【讨论】:

  • 所以我只需要在函数内部创建一个新变量?
  • 您需要在函数内部获取新的随机值,如代码示例 1。更好的版本是使用没有递归调用的循环结构。
【解决方案2】:

这是解决您问题的小技巧:

使用 setTimeout 来避免此错误消息,应用程序会看到无限循环的问题。

您还需要为 a 和 b 创建新值!

function en_Til_Ni() {
    return Math.floor(Math.random()*9)+1;
} 

var enTilNi = en_Til_Ni(); 
console.log(enTilNi);

var a = en_Til_Ni();
console.log("a" + a);
var b = en_Til_Ni();
console.log("b" + b);
var c = en_Til_Ni();
console.log("c" + c);


console.log("---------------------------------------------");

function ikkeLike() { 

    if (a != b) {
        console.log(a, b);
    }

    else if (parseInt(a) == parseInt(b) ) { // It logs the numbers just fine, untill a == b
    
    console.log (" a == b  TRUE" ); 

    a = en_Til_Ni();
    b = en_Til_Ni();
    c = en_Til_Ni();

        setTimeout ( ikkeLike , 1 ) 
        console.log("cool")
        
    }

}

ikkeLike();

【讨论】:

  • 谢谢,我会试试的! parseInt 做了什么?
  • 不需要解析,只是检查!主要问题是当 a==b 之后他们永远不会获得新值...无限循环发出红色警报。你有按钮 Run on code sn-p !
【解决方案3】:

好的,所以我正在尝试制作一个小型数独生成器,但我没有得到 早在我遇到问题之前。

您似乎想检查您生成的三个值是否不相等 - abc。并且您希望继续生成 bc 的值,直到它们都不同为止。

更改您的方法en_Til_Ni,使其不断生成随机值,直到值唯一为止。

function en_Til_Ni() 
{
    var newValue = Math.floor(Math.random()*9)+1;
    args = [].slice.call(arguments);
    var isNotNew = args.some( function( item ){
       item == newValue;
    });

    return !isNotNew ? newValue : en_Til_Ni.apply( this, args ) ;
}

现在此方法将始终返回唯一值

var a = en_Til_Ni();
console.log("a" + a);
var b = en_Til_Ni(a);
console.log("b" + b);
var c = en_Til_Ni(a,b);
console.log("c" + c);

【讨论】:

    【解决方案4】:

    这是一个没有增量部分的递归。让我们看看没有第一个条件的ikkeLike():

    function ikkeLike() {
      // We removed the first case for the simplicity
      if (a == b) {
        ikkeLike();
      }
    }
    

    现在您可以很容易地看到,在这种情况下,它只是一个无限循环...... 您需要通过在递归调用之前更改“a”或“b”来解决这种情况:

    function ikkeLike() {      
      if (a == b) {
        // <--Change 'a' or 'b' here before the recursive call to avoid infinite loop!
        ikkeLike();
      }
    }
    

    【讨论】:

    • 谢谢!这真的帮助了我。
    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 2021-01-21
    • 2021-11-03
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2015-10-24
    相关资源
    最近更新 更多