Рекурсивная функция - продолжает возвращать 0? - PullRequest
2 голосов
/ 01 февраля 2012

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

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

    else

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

} 

Ответы [ 7 ]

4 голосов
/ 01 февраля 2012

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

return integer * (factorial(0))

, который разрешится в

return integer * 0

, что составляет 0

4 голосов
/ 01 февраля 2012

Вы всегда умножаете результат на ноль в базовом случае. Факториал 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);
    }
}

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

3 голосов
/ 01 февраля 2012

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

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

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

2 голосов
/ 01 февраля 2012

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

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 голос
/ 01 февраля 2012

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

1 голос
/ 01 февраля 2012

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

Пример:

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

0 голосов
/ 01 февраля 2012

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

if( integer < 2)
{
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...