Понимание рекурсии, c ++ - PullRequest
0 голосов
/ 20 ноября 2011

Для приведенного ниже кода, может ли кто-нибудь сказать мне, почему функция всегда возвращает «0», если возвращаемое значение для базового случая (n == 0) равно 0?Я знаю, что для исправления этой функции мне просто нужно заменить «return 0» на «return 1», однако я пытаюсь понять, почему он возвращает 0 для базового случая ниже.

Спасибо за вашу помощь

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

Редактировать: Надеюсь, код ниже не имеет логических ошибок ...

#include<iostream>
#include<math.h>
using namespace std;

long double factorial (long double n) {
    if (n==0) return 1;
    if (n<0) return -fabs((n*factorial(n+1)));
    return n*(factorial(n-1));
}

int main () {
    long double n;
    cout << "Enter a number: ";
    cin >> n;
    cout << "Factorial of " << n << " is " << factorial(n) <<endl;
    return 0;
}

Ответы [ 6 ]

5 голосов
/ 20 ноября 2011

Возвращает ноль, поскольку любое число, умноженное на ноль, равно нулю. Вы начинаете с некоторого числа n, скажем, n = 5. При прохождении рекурсии у вас есть:

n * factorial(n-1)
5 * factorial(5-1)
5 * 4 * factorial(4-1)
5 * 4 * 3 * factorial(3-1)
5 * 4 * 3 * 2 * factorial(2-1)
5 * 4 * 3 * 2 * 1 * factorial(1-1)

Но факториал (1-1) - это факториал (0), который возвращает 0, поэтому вы получите:

5 * 4 * 3 * 2 * 1 * 0 = 0
5 голосов
/ 20 ноября 2011

Этот код просто неверен. Независимо от того, какое n> 0 он получает в качестве аргумента, каждое значение в конечном итоге умножается на 0 и, следовательно, factorial (n) = 0 для всех n> 0.

5 голосов
/ 20 ноября 2011

Если вы посмотрите, как определяется факториал, вы найдете что-то вроде:

f(0) = 1
f(1) = 1
f(n) = f(n-1) * n

Таким образом, ваша функция действительно возвращает неправильное значение для factorial(0). Рекурсия в этой функции в основном работает путем уменьшения n при каждом новом вызове функции factorial.

Предположим, вы звоните factorial(3). n будет, если с 3 ветвь else будет выполнена, так как n не равен нулю. Мы следуем третьему правилу нашего определения вызова factorial(2) (который является n-1) и умножаем результат этого на n. Ваша функция будет понижаться до тех пор, пока не будет вызван factorial(0), и вернет 0, который затем является фактором всех предыдущих вычислений, в результате чего получается 3*2*1*0, что равно 0.

1 голос
/ 20 ноября 2011

Для приведенного ниже кода, может ли кто-нибудь сказать мне, почему функция возвращает «0», если возвращаемое значение для базового случая (n == 0) равно 0?

Кто-то решил сделать это. Вы должны спросить автора, почему они это сделали.

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

Вероятно, потому что человек, который написал это, думал 0! был равен 0.

0 голосов
/ 20 ноября 2011

Для любого n (больше или равно 0) вы умножаете множество чисел до factorial(0), что возвращает 0.

Результат

n*(n-1)*(n-2)*...*3*2*1*0

большой жирный 0

PS Помимо неправильного вычисления, код имеет большой недостаток.Если вы дадите ему отрицательное число, вы заставите его плакать.

0 голосов
/ 20 ноября 2011

Я не задаю вам вопрос полностью, но позволяет вызвать функцию f (int n): int okey, чтобы сделать ее короче

для n = 0 он вернет 0, потому что это то, что вы сказали, чтобы он делал правильно: if (n == 0) return 0; для n + 1 вы получите следующий шаблон: f (n + 1) ==> n * f (n) потому что ты сказал, что ты должен поступить иначе? и f снова оценит.

, поэтому ваша функция в любом случае вернет 0, и если вы измените базовый вариант на 1, вы получите:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...