2013-06-02 3 views
3

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

function newNumber(next,previous) { 
    if (next != previous) 
     return next; 
    else { 
     next = Math.floor(Math.random()*10); 
     newNumber(next, previous); 
    } 
} 

Что было бы лучшим способом заставить это работать?

+0

Нет, рекурсия здесь неправильный метод. Не злоупотребляйте рекурсией, когда она не нужна. – gdoron

+1

Вы хотите сравнить число с * всеми * предыдущими использованными случайными числами или просто последним возвращенным случайным числом - т.е. вы никогда не хотите, чтобы этот новый номер возвращал один и тот же номер два раза подряд. – Alan

+0

последний. Я хочу, чтобы функция всегда показывала новое значение по сравнению с предыдущим. – Emanegux

ответ

3

Застежка:

var newNumber = (function() { 
    var previous; 

    return function() { 
     var nextValue; 
     while ((nextValue = Math.floor(Math.random() * 10)) === previous); 

     previous = nextValue; 
     return nextValue; 
    }; 
})(); 

Fiddle

+0

@AdamRackis, я вроде скопировал ваш код и адаптировал его к закрытию, так что это может показаться знакомым ... :) – gdoron

+1

Я бы сказал, что вы добавили много ценности , так хорошо сделано :) –

+0

Я нашел много аспектов этого ответа весьма полезным. принимаем. – Emanegux

1

Просто добавьте return в newNumber(next, previous); в else блок. Код выглядит следующим образом:

function newNumber(next,previous) { 
    if (next != previous) 
     return next; 
    else { 
     next = Math.floor(Math.random()*10); 
     return newNumber(next, previous); 
    } 
} 
7

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

Что-то вроде -

function newNumber() { 
    var nextValue; 
    while ((nextValue = Math.floor(Math.random()*10)) === newNumber.previous) ; 

    newNumber.previous = nextValue; 
    return nextValue; 
} 
+0

+1, для того, чтобы не использовать рекурсию. – gdoron

+0

Боковой вопрос: предпочитаете ли вы использовать свойство или использовать закрытие? – Alan

+0

@Alan - закрытие - просто причудливый способ сказать, что функция «запоминает» контекст («контекст активации»), который существовал, когда он был создан. Насколько я могу судить, на самом деле это не то или другое, а рекурсия. –

3

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

function newNumber(previous) { 
    var next = Math.floor(Math.random()*9); 
    if (next >= previous) next++; 
    return next; 
} 
+1

Теперь это не случайно. Вероятность получить 'previous + 1' больше: D – Arjun

+0

Это просто неправильная случайная реализация, вы можете использовать цикл for и пропускать Math.random ... и я считаю, что он не хочет сохранять предыдущее значение. – gdoron

+0

@ Арджун: Вы ошибаетесь. Посмотрите на код и подумайте еще раз. – Guffa

Смежные вопросы