основная функция не вызывает функцию collatzSequencer - PullRequest
1 голос
/ 16 октября 2019

В настоящее время я работаю над проектом для колледжа, первого курса компьютерных классов. С учетом вышесказанного я не прошу ответа, но я прошу еще несколько советов. Чтобы начать проект, я решил создать функцию с именем collatzSequencer, которая принимает один аргумент типа int.

Вот мой прототип функции:

int collatzSequencer(int);

Вот определение моей функции:

int collatzSequencer(int n) {
    int stepCounter = 0;
    if (n % 2 == 0) {
        stepCounter += 1;
        collatzSequencer(n / 2);
    }
    else if (n % 2 == 1) {
        stepCounter += 1;
        collatzSequencer((3 * n) + 1);
    }
    else if (n == 1) {
        printf("%d\n", n);
        printf("%d\n", stepCounter);
        return 0;

Здесь я вызываю функцию в моей основной функции:

int main(int argc, char* argv[]) {
    int num = 5;
    collatzSequencer(num);
    return 0;
}

Когда я запускаю свою программу, ничего не происходит, и я выхожу с кодом 0. Я попытался отладить свою программу, и я вижу, что по какой-то причине моя IDE даже не запускает функцию collatzSequencer, когда она вызывается,Хотя я новичок, я чувствую, что у меня достаточно знаний, чтобы найти проблемы только в 48 строках кода, однако я не могу найти эту проблему здесь. У кого-нибудь есть идеи?

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

Вы проверяете три случая:

n % 2 == 0 (eg. n is Even)
n % 2 == 1 (eg. n is Odd)
n == 1  (eg. n is exactly ONE; this is also the only if-statement with a return)

Кроме : значение 1 является числом ODD , котороезахвачен вторым случаем.

Ваш код никогда никогда не достигнет n==1 случая, потому что когда n равен 1, он будет всегда получает сначала оператор if нечетного значения.

0 голосов
/ 16 октября 2019

Функция имеет неопределенное поведение, потому что она ничего не возвращает, когда n% 2 равно 0 или 1 и последний оператор else-if не достигнут элементом управления функции.

Более того, переменная stepCounterможет иметь максимальное значение 1, потому что это локальная переменная функции, которая при каждом рекурсивном вызове функции инициализируется нулем.

int stepCounter = 0;

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

#include <stdio.h>

size_t collatzSequencer( unsigned int n ) 
{
    return  n < 2 ? 0 : 1 + collatzSequencer( n % 2 == 0 ? n / 2 : 3 * n + 1 ); 
}

int main(void) 
{
    printf( "%zu\n", collatzSequencer( 27 ) );

    return 0;
}

Его вывод

111

, как написано в https://en.wikipedia.org/wiki/Collatz_conjecture

...