Для начала было бы правильнее объявить параметр как имеющий тип unsigned int
. В противном случае уменьшение параметра с отрицательным значением может привести к очень длинной последовательности вывода.
В каждом рекурсивном вызове функции параметр сначала уменьшался, а после его уменьшения печатал выход.
func(--x);
^^^^
printf("%d\t",x);
Таким образом, если функция изначально была вызвана с аргументом, равным 2
, то он выводит значение 1
, потому что аргумент был уменьшен.
Так
func(2) --> outputs 1
func(1) --> outputs 0
func(0) --> outputs nothing
только вызов внутренней функции выводит его значение в первую очередь.
Если вы хотите, что выход будет выглядеть
0 1 2
то функция должна быть определена, как показано в этой показательной программы
#include <stdio.h>
void func(unsigned int x)
{
if (x) func(x - 1);
printf("%u\t", x);
}
int main(void)
{
func(2);
putchar('\n');
}
Выходная функция
0 1 2
Функция отличается от исходной функции тем, что сам аргумент не является сглаженный в вызове функции. Он сохраняет свою ценность без изменений.
if (x) func(x - 1);
^^^^^^ the variable x itself is not changed
Если рекурсивный вызов происходит в начале метода, он называется головой рекурсии. Метод сохраняет состояние перед переходом в следующий рекурсивный вызов.
Похоже, вам, возможно, потребуется научиться использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого.Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver
Строка 'if (x == 0) return, 'вряд ли может быть яснее. Если 'x'' '0, то не выполняйте остальные функции. –
В качестве следующего упражнения - поменяйте строки 'printf' и' func'. Затем перейдите и прочитайте о * рекурсии головы * против * хвоста рекурсии *. –