Факториалы / комбинации дают NaN, когда не предполагается - PullRequest
1 голос
/ 14 апреля 2011

Я решаю для тебя Выберите p комбинаций. Я начинающий с Javascript.

Я произвел это определение факториальной функции: Было намерено сделать х * (х-1) * (х-2) ... * 1.

function factorial(z)
{
    var product = z;
    if (z == 0)
    {
        return 1;
    }
    else
    {
        for (var m = 1; m < z; m++)
        {
            product = m * product;
            return product;
        }
    }
}

У меня есть эта функция, которая использует функцию факториала.

function placeBoxes()
{
    var ids = 0;
    for (var y = 0; y < (numOfRows-1); y++)
    {
        for (var p = 0; p < (y+1); p++, ids++)
        {
            x = document.createElement('div');
            x.className = "box";
            x.id = ids;
            x.innerHTML = (factorial(y))/((factorial(y-p))*(factorial(p)));
            document.getElementById('holdsBoxes').appendChild(x);
        }
    }
}

Предполагается выбирать комбинации. Для экспериментальных целей numOfRows реально находится между 5 и 30. 0C0 1C0 1C1 2C0 2C1 2C2 и так далее ... Это эквивалентно 1, 1, 1, 1, 2, 1 и т. Д. ...

Кто-нибудь знает, что я сделал не так? Я получаю NaN вместо значения для второго, третьего, пятого, восьмого, девятого и многих других значений.

Редактировать : Спасибо всем! Проблема решена. Факторная функция была испорчена.

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Изменение

    for (var m = 1; m < z; m++)
    {
        product = m * product;
        return product;
    }

Для

    for (var m = 1; m < z; m++)
    {
        product = m * product;
    }
    return product;

Вы никогда не завершаете цикл

1 голос
/ 14 апреля 2011

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

function factorial(z)
{
    var product = z;
    if (z == 0)
    {
        return 1;
    }
    else
    {
        for (var m = 1; m < z; m++)
        {
            product = product*(product - m);
        }
        return product;
    }
}
1 голос
/ 14 апреля 2011
for (var m = 1; m < z; m++)
{
    product = m * product;
    return product;
}

Ваше возвращение product в вашем цикле. Вы в этом уверены? Разве вы не хотите вернуть product за пределы цикла?

Это также причина вашего NaN. Что если z равно 1? тогда m < z равно m < 1, и это всегда ложно. Так что это тело цикла никогда не вызывается. и оператор return никогда не вызывается.

Итак, функция возвращает undefined. А undefined * 1 === NaN

...