2015-05-12 6 views
-2

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

var num 
var array1 = new Array(); 

function FirstFactorial(num) {  
    for (var i = num; i>0; i--){  // 8 , 7, 6 , 5 
     for (var y = 0; y<num ; y++){ // 0, 1, 2, 3, 4 
     array1[y]=i;  // we have an array that looks like [8,7,6,5,4,3,2,1] 
     }; 
    }; 
    var sum = 1 
    for (var x = 0; x<array1.length; x++){ // now I want to run up that array, reading the #s 
     sum = sum * array1[x]; 
     return sum; 
    }; 
    return sum 
}; 
+1

В чем проблема? – thefourtheye

+0

Вы возвращаете сумму в своем последнем цикле for, первая итерация через этот цикл будет делать возврат, а остальная часть массива не будет обработана –

+1

Опишите проблему. – Blorgbeard

ответ

0

Несколько вопросов.

1/Это незначительно, но когда вы умножаете два числа, вы получаете продукт, а не сумму.

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

3/Ваша вложенная петля не заполняет ваш массив так, как вы описываете, вы должны проверить его после популяции. Подумайте о ваших петлях, выраженных в виде псевдокода:

for i = num downto 1 inclusive: 
    for y = 0 to num-1 inclusive: 
     array1[y] = i 

Вы можете видеть, что внутренний цикл заполнения всего массива со значением текущего i. Итак, последняя итерация внешнего цикла, где i - одна, устанавливает весь массив в единицы.

4/В любом случае, вам не нужно массив для хранения всех чисел от 1 до n, просто использовать номера 1 к n непосредственно. Что-то вроде (опять-таки, псевдокод):

def fact(n): 
    prod = 1 
    for i = 2 to n inclusive: 
     prod = prod * i 
    return prod 
+0

Извините ... они не позволят мне увеличить ваш великий ответ без 15 карм .... – Kvera

0

Это гораздо более простой способ расчета факториала числа.

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

Однако исправить код нужно исправить первоначальный цикл, который загружает числа в массиве. а также удалить оператор return в нижнем цикле. Вот так.

function FirstFactorial(num) {  
 
    for (var i = num; i>0; i--) { 
 
     array1[num - i] = i; 
 
    }; 
 
    var sum = 1 
 
    for (var x = 0; x < array1.length; x++){ // now I want to run up that array, reading the #s 
 
     sum = sum * array1[x]; 
 
    }; 
 
    return sum 
 
};

+0

honerlawd, большое спасибо за внимание. Не могли бы вы объяснить мне, почему исходный цикл был неправильным? – Kvera

+0

Ваш внешний цикл сверху работал нормально и подсчитывался соответственно от числа до 1. Однако ваш внутренний цикл подсчитывался от 0 до 7. Таким образом, вы заполняли каждый индекс в массиве любым числом, в котором был внутренний контур, и перезаписывая все предыдущие номера. Если это имеет смысл. – honerlawd

+0

Разве это не то, что он должен был делать? Хранить массив1 [0] = 8, array1 [1] = 7 и т. Д.? Извините, конечно, я новичок. – Kvera