В чем смысл этой функции?Это нормально, что у него есть две команды возврата? - PullRequest
0 голосов
/ 28 декабря 2018

Что делает этот код?Почему у него есть два возвращаемых значения?

int MSum(int N){
   if (N == 1)
       return 1;
   return N + MSum(N - 1);
}

Я попытался написать следующую программу для его запуска.Он хорошо компилируется, но я получаю сообщение об ошибке:

#include <stdio.h>
int MSum(int N);

int main(){
    int n, o;
    printf("Εισάγετε ακέραιο: ");
    scanf("%d", &n);
    o = MSum(n);
    printf("%d", o);
    return 0;
}

int MSum(int N){
    if (N == 1)
        return 1;
    return N + MSum(N - 1);
}

Я получаю ошибку:

/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Смысл функции заключается в суммировании всех чисел от 1 до N, где N - передаваемый параметр.Функция вызывает себя рекурсивно, когда N != 1, чтобы получить сумму ..., добавив N к сумме чисел до N-1.Кстати, код, который вы разместили, прекрасно компилируется и работает в моей системе (без какого-либо касания), так что, вероятно, вы не тестировали код, который вы разместили, и он не совпадает с кодом, который вы тестировали.Попробуйте скомпилировать:

cc -o pru pru.c

, где pru - это имя программы, а pru.c - файл, в котором у вас есть код.

Это упражнение для проверки того, как рекурсивные функцииможет использоваться в C. Но если вы не знаете, что можете использовать два разных оператора return в одной и той же функции, вы пытаетесь слишком быстро освоить язык C.Рекурсия в C более продвинута, чем оператор return.Я могу порекомендовать вам прочитать «Язык программирования C», от Брайана Кернигана и Денниса Ричи .

0 голосов
/ 28 декабря 2018

Наличие более одного оператора return не имеет ничего общего с ошибкой, которую вы получаете.В вашем случае

if (N == 1)
    return 1;
return N + MSum(N - 1);

совпадает с

if (N == 1)
{                        //block starts
    return 1;
}                       //block end
return N + MSum(N - 1);

, поэтому оператор return 1; находится в условном блоке и выполняется только при выполнении условия.

Что касается ошибки, которую вы видите, это может помочь.

...