2015-07-08 4 views
0
function FirstFactorial(num) { 
     for(var i = num - 1; i > 0; i--) { 
      return num * i; 
     }   
    }; 

    console.log(FirstFactorial(8)) 

Я просто хочу знать, что такое мой код, как это, не печатает факториал? Вместо этого я получаю только 56, что составляет 8 * 7. Я думал, что если я использую цикл for, который он будет продолжать?Почему это не дает мне факториал?

+3

Вы прерывание для цикла с вашим возвращением заявления. Вам нужно вернуться за пределы цикла. – nhaarman

ответ

1

Использование:

for(var i = num - 1; i > 0; i--) { 
    return num * i; 
} 

Это будет возвращать num*(num-1) значение. Так как он вернет значение в первой итерации.

Вместо этого используйте:

Использование рекурсии:

function FirstFactorial(num) { 
    if(num==1) 
     return num; 
    else 
     return num*(FirstFactorial(num-1)) 
} 

или:

fact=num; 
for(var i = num - 1; i > 0; i--) { 
    fact*=i; 
} 
return fact; 

EDIT: По требованию О.П., чтобы объяснить, как возвращение будет работать в методе рекурсивного ,

Что касается рекурсии:

return num*FirstFactorial(num-1) 

фактически первый умножает num с возвращаемым значением FirstFactorial(num-1) который будет (n-1)!. Следовательно, что на самом деле произойдет:

  1. FirstFactorial(num-1) называется. (Первая факториальная функция вызывается с параметром num-1.
  2. Возвращаемое значение FirstFactorial(num-1), которое равно (num-1)!, умножается на значение num для получения num!.
  3. Это значение (num!) затем возвращается функцией FirstFactorial() при передаче с параметром num или FirstFactorial(num)

Теперь о вызове FirstFactorial(num-1) внутри FirstFactorial(num), FirstFactorial функция снова будет выполнена проверка первого, если условие. Если он терпит неудачу, он вернет значение (n-1)*FirstFactorial(num-1 - 1). Это будет возвращено до тех пор, пока условие не будет удовлетворено, и значение будет возвращено без повторного вызова FirstFactorial.

Вы также можете думать, как функция:

function FirstFactorial(num) { 
    if(num==1) 
     return num; 
    else { 
     a = FirstFactorial(num-1); 
     a = a * num; 
     return a; 
    } 
} 
+0

ok, это может показаться глупым, но для оператора return в рекурсии, почему он должен иметь FirstFactorial в: return num * (FirstFactorial (num-1))? То, что я пытаюсь спросить, - это то, что умножает его на FirstFactorial (num-1), чем отличается от его простого (num-1)? – joyfulchute

+0

@joyfulchute Хорошо 'n! = n * (n-1)! 'Следовательно, вам нужно использовать' return num * FirstFactorial (num-1) '. То, что вы сказали, было что-то вроде 'n! = n * (n-1) '. Надеюсь, теперь вы понимаете необходимость «FirstFactorial (num-1)», а не 'n-1'. Если у вас все еще есть сомнения, спросите. –

+0

Спасибо! Хотя я не полностью понимаю эту идею, я думаю, что сейчас я начинаю понимать ее больше! Я думаю, что я просто запутался, так как не вижу, как я могу умножить на Firstfactorial (num-1), потому что, как я вижу, например, когда я вызываю FirstFactorial (8), руны кода (8 * FirstFactorial (7))? – joyfulchute

1

Когда вы используете return, он выходит из функции и возвращает первый num*i, чтобы предотвратить его, сделать локальную переменную в вашей функции и вернуть ее в конце цикла.

Пример:

function FirstFactorial(num) { 
    var result=1; 
    for(var i = num - 1; i > 0; i--) { 
     result *= i; 
    }   
    return result 
}; 
0

Попробуйте что-то вроде:

function FirstFactorial(num) { 
    var fact = 1; 
    for(var i = num; i > 0; i--) { 
     fact = fact * i; //here you are returning on your first iteration iteslef and hence issue 
    } 
    return fact;   
}; 

console.log(FirstFactorial(8)) 

когда вы говорите return, было бы прервать вызов метода и вернуться к родителю со значением (если он делает) что вы вернетесь. Таким образом, в вашем случае он вернется 8 * 7 = 56

0

Вы возвращаете свое значение при первом повторении в своем цикле, а не в конце. Это должно сделать трюк:

function FirstFactorial(num) { 
     var result = num; 
     for(var i = num - 1; i > 0; i--) { 
      result = result * i; 
     } 
     return result;   
    }; 

    console.log(FirstFactorial(8)) 
1

Вы проходите 8 и умножаете 8 * 7 и возвращаете 56. Вы не накапливаете. Вам нужна рекурсия здесь:

function FirstFactorial(num) 
{ 
    if (num == 1) 
     return num; 
    else 
     return num * FirstFactorial(num - 1); 
} 
0

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

function factorial(num) { 
    var result = num; 

    for (var i = num - 1; i > 0; i--) { 
     result = result * i; 
    } 

    return result; 
} 

Примечание факторное является кандидат рекурсивным:

function factorial(num) { 

    if (num > 0) { 
     return num * factorial(num - 1); 
    } else { 
     return 1; 
    } 
} 
Смежные вопросы