Member 14955513 Ответов: 1

Функция возвращает 0, когда это не должно быть сделано


Я попытался написать функцию, которая вычисляет факториал числа. Почему он всегда возвращает 0 независимо от того, какое число вычисляется?

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int getfactorial(int number){

    if (number > 0){
        return number*getfactorial(number-1);
    }
    if (number <= 0){
        return 0;
    }
}


int main() {
    printf("%d", getfactorial(5));
    return 0;
}

0x01AA

Потому что if (number <= 0){
return 0;
}

Две возможности для решения этой проблемы:
один.) if (number <= 0){
return 1;
}

б.)
if (number > 1){
return number*getfactorial(number-1);
}
else {
return 1;
}

Member 14955513

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

Rick York

Почему факториал числа не может быть вычислен? Я думаю, что это будет потому, что он меньше нуля, или результат будет слишком большим для используемого типа данных. Для 32-битного результата максимальное значение равно 4G или 2^32. Вам нужно будет выяснить, какое самое большое значение, факториал которого меньше максимального, и установить его как самый большой допустимый входной сигнал. Если вы используете 64-битные значения, то максимум будет еще больше.

Dave Kreskowiak

Зачем вы вообще вставляете это второе утверждение if? Если первый тест числа возвращается ложным, то число всегда будет равно или меньше нуля.

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

1 Ответов

Рейтинг:
9

Patrice T

Цитата:
Почему он всегда возвращает 0 независимо от того, какое число вычисляется?

Поэтому:
int getfactorial(int number){

    if (number > 0){
        return number*getfactorial(number-1);
    }
    if (number <= 0){
        return 0; // this is wrong
    }
}

Перепроверьте определение факториала.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


CPallini

5.

Patrice T

Спасибо