давайте предположим следующий код в c:
#include <stdio.h>
#include <cs50.h>
int test (int a, int b);
int main(void)
{
test(2,3);
}
int test (int a, int b)
{
int c = a+b;
printf("%d \n", test(a,b));
return c;
}
почему невозможно распечатать значение test без необходимости сохранять его в переменной до этого и распечатывать переменную? Я получаю сообщение об ошибке:
function.c:12:1: ошибка: все пути через эту функцию будут вызывать себя [-Werror,-Winfinite-recursion]
Спасибо!
#include <stdio.h>
#include <cs50.h>
int test (int a, int b);
int main(void)
{
test(2,3);
}
int test (int a, int b)
{
int c = a+b;
printf("%d \n", test(a,b));
return c;
}
Если вы запустите эту программу на довольно большом наборе возможных комбинаций компьютер + операционная система, вы, скорее всего, получите переполнение стека из-за бесконечной рекурсии.
Рекурсивные функции должны иметь один или несколько базовых случаев, которые могут быть решены без рекурсии, и один или несколько альтернативных путей, которые делают рекурсивные вызовы для решения более простой задачи. У вас есть рекурсивные вызовы; у вас нет базового варианта. И не ясно, приближает ли вас рекурсивный вызов к решению. Хотя в некоторых отношениях это не очень хороший пример, рекурсивная факториальная функция демонстрирует базовый случай (n <= 1
) и рекурсивный случай (n * factorial(n - 1)
): int factorial(int n) { if (n <= 1) return 0; return n * factorial(n - 1); }
.
Сообщение об ошибке вполне понятно. Тест-функция вызывает сама себя. И внутри этого вызова он снова вызывает себя (и снова, и снова...).
Это никогда не будет завершено.
Это тип бесконечного цикла, обычно называемый бесконечной рекурсией.
Возможно, что вы хотите?
#include <stdio.h>
#include <cs50.h>
int test (int a, int b);
int main(void)
{
test(2,3);
}
int test (int a, int b)
{
int c = a+b;
printf("%d \n", c); // Show the result of the calculation
// but without calling this function again.
return c;
}
Как говорится в сообщении компилятора, функция вызовет сама себя, потому что в printf("%d \n", test(a,b));
код test(a,b)
вызывает test
. Внутри этого вызова test
функция снова вызовет сама себя, и это будет повторяться вечно (вплоть до ограничений реализации C).
Чтобы напечатать возвращаемое значение функции, сделайте это вне функции:
#include <stdio.h>
int test(int a, int b);
int main(void)
{
printf("%d\n", test(2, 3));
}
int test(int a, int b)
{
return a+b;
}
Это вполне возможно. Но ваша функция бесконечно рекурсивна (как сказал вам ваш компилятор). Вам нужен способ перестать звонить
test()
.