2017-02-16 8 views
2
#include<stdio.h> 
void func(int x) 
{ 
    if (x==0) 
     return; 
    else 
    { 
     func(--x); 
     printf("%d\t",x); 
    } 
} 
void main() 
{ 
    int k=2; 
    func(k); 
} 

Выход: 0 1Как рекурсии работу здесь (код ниже)

Почему не выход 0 1 2?

Когда функция вызывается в первый раз, значение x равно 2. Затем оно также должно быть напечатано в конце. Я смущен этим кодом. Может кто-нибудь помочь мне?

+3

Похоже, вам, возможно, потребуется научиться использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого.Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

Строка 'if (x == 0) return, 'вряд ли может быть яснее. Если 'x'' '0, то не выполняйте остальные функции. –

+0

В качестве следующего упражнения - поменяйте строки 'printf' и' func'. Затем перейдите и прочитайте о * рекурсии головы * против * хвоста рекурсии *. –

ответ

1

Для начала было бы правильнее объявить параметр как имеющий тип 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 

Если рекурсивный вызов происходит в начале метода, он называется головой рекурсии. Метод сохраняет состояние перед переходом в следующий рекурсивный вызов.

0

Вам просто нужно поменять рекурсивный вызов после печати.

#include<stdio.h> 
void func(int x){ 
if(x==0){printf("%d\t",x); 
return;} 
else{ 
    func(--x); 
    printf("%d\t",x+1); 
    } 
    } 
int main(){ 
    int k=2; 
    func(k); 
} 
+2

Как это ответить на вопрос? –

+0

Пожалуйста, объясните больше. – Thecave3

+0

Если вы сначала напечатаете f, а затем позвоните, вы получите правильный вывод – Thecave3

1

--x уменьшает значение х, и вы делаете, что перед печатью; поэтому выход 0 1, а не 0 1 2.

0

Здесь первое значение x уменьшается и помещается в стек каждый раз, пока x == 0, а затем окончательный результат аккумулируется в точном обратном порядке вызова исходной рекурсивной функции.