2012-01-31 6 views
2

Im пытается написать рекурсивную функцию, которая возвращает факториал числа. Если число равно 0 или отрицательное, то оно должно возвращать 0. Однако каждый раз, когда я проверяю его, он всегда возвращает 0, может ли кто-нибудь пролить свет на это, пожалуйста?Рекурсивная функция - возвращает 0?

int factorial(int integer) 
{ 
    if(integer <= 0) 
    { 
     return 0; 
    } 

    else 

     return integer* (factorial(integer-1)); 

} 

ответ

4

Как продолжает называть себя целым числом - 1, то в конечном счете называть себя с 0, и тогда вы будете иметь вызов вроде этого:

return integer * (factorial(0)) 

, который будет решать

return integer * 0 

который равен 0

+0

Спасибо за все ваши ответы, но мне сказали, что если 0 или отрицательное число введено, метод должен вернуть 0.Is нет способа его реализации? – matt

+0

Конечно, просто добавьте еще один «if»: если параметр равен 1, верните 1. – theglauber

4

Вы всегда результат умножить на ноль в вашем базовом случае. Факториал 0 является 1, а не 0.

Если функция должна возвращать 0, когда входной меньше 1:

int factorial (int integer) { 
    if (integer < 1) { 
     return 0; 
    } else if (integer == 1) { 
     return 1; 
    } else { 
     return integer * factorial(integer-1); 
    } 
} 

Не самая короткая реализация, но вполне читаемым.

0

Вы должны вернуть 1, умножая 0 всегда возвращает 0:

if(integer < 2) 
{ 
    return 1; 
} 
3

Ваша функция должна возвращать 1 в базовом варианте, как это:

if (integer <= 0) { 
    return 1; 
} 

Вы умножая числа и, как вы знаете, что любое число, умноженное на 0, равно нулю. Вместо этого вам нужно использовать 1, мультипликативное тождество, так как любое число, помноженное на одно, является самим номером.

1

Просто используйте 1 вместо 0. При использовании 0 любое число, которое у вас есть, будет умножено на 0, возвращая 0.

Пример:

5! = 5.4.3.2.1 = 120, а не 5.4.3.2.1.0 = 0

2

Попробуйте выполнить простой тест, с карандашом и бумагой:

main: 
    factorial(3) 
    return 3 * factorial(2) 
     factorial(2) 
     return 2 * factorial(1) 
      factorial(1) 
      return 1 * factorial(0) 
       factorial(0) 
       return 0 
      return 1 * 0 (equals 0) 
     return 2 * 0 (equals 0) 
    return 3 * 0 (equals 0) 

Таким образом, оказывается, что каждый рекурсивный достигает " 0" .

Попробуйте добавить это условие:

else if(integer == 1) 
    return 1; 
1

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

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