AngularJS динамически вводящий контроллер, класс и т. Д.

Проблема заключается в том, что по мере приближения к насыщению вы начинаете получать больше и больше, чтобы генерировать уникальный номер «случайно». Например, в приведенном выше примере max равен 10. После того, как использованный массив чисел содержит 8 чисел, потенциально может потребоваться много времени для поиска 9-го и 10-го. Вероятно, здесь создается максимальная ошибка стека вызовов.

jsFiddle Demo showing iteration count being maxed

Повторяя внутри вашей рекурсии , вы можете видеть, что большое количество выполнения происходит, когда массив полностью насыщен, но функция вызывается. В этом случае функция должна выйти.

jsFiddle Demo with early break

if( used.length >= max ) return undefined;

И последний способ выполнить оба итерационные проверки и бесконечная рекурсия будут такими, как jsFiddle Demo :

function randomNum(max, used, calls){
 if( calls == void 0 ) calls = 0;
 if( calls++ > 10000 ) return undefined;
 if( used.length >= max ) return undefined;
 var newNum = Math.floor(Math.random() * max + 1);
 if($.inArray(newNum, used) === -1){
   return newNum;
 }else{
   return randomNum(max,used,calls);
 }
}

0
задан Community 23 May 2017 в 10:24
поделиться