Função recursiva C (1): uma breve introdução

Função recursiva C (1): uma breve introdução

Chamada de função comum

Vejamos primeiro um exemplo simples de chamada de função:

#include <stdio.h>

//定义一个简单的打印函数 print_num
void print_num(int n)
{
    
    
        printf("n = %d\n",n);
}

int main()
{
    
    
        int i=5;
        print_num(i);//调用print_num函数

        return 0;
}

resultado da operação:

n = 5

Função recursiva de pré-encomenda

Ok, agora faremos algumas modificações neste programa C:

#include <stdio.h>

void print_num(int n)
{
    
    
        if(n>0)//如果n>0执行下面代码块
        {
    
    
                printf("n = %d\n",n);//先打印当前n的值
                n--;//再执行n-1
                print_num(n);//再自己调用自己,这种函数就叫递归函数
        }
}

int main()
{
    
    
        int i=5;
        print_num(i);

        return 0;
}    

resultado da operação:

n = 5
n = 4
n = 3
n = 2
n = 1

Vamos analisar agora:

  • O programa entra e executa a função principal, i = 5, e então chama a função print_num, passando o parâmetro n = 5;
  • O programa insere a função print_num e a condição é avaliada primeiro, n = 5, portanto, primeiro imprima n = 5 e, em seguida, n-1, n torna-se 4;
  • Insira a função print_num novamente, o mesmo que acima, primeiro juiz, n = 4, então imprima n = 4 , então n-1, n torna-se 3;
  • Repita a operação acima para imprimir n = 3, n = 2, n = 1 e então n-1 e n tornam-se 0;
  • Vá para a função print_num novamente para determinar se n é maior que 0. Se não for maior que 0, nenhuma operação será realizada em seguida, e a função print_num termina.
    Chamamos essa função recursiva de recursão de pré-ordem .

Função recursiva pós-pedido

Vamos transformar o código anterior: coloque printf após a recursão

#include <stdio.h>

void print_num(int n)
{
    
    
        if(n>0)//如果n>0执行下面代码块
        {
    
    
                n--;//再执行n-1
                print_num(n);//再自己调用自己,这种函数就叫递归函数
                printf("后序n = %d\n",n);//再调用自己之后再打印n的值
        }
}

int main()
{
    
    
        int i=5;
        print_num(i);

        return 0;
}    

resultado da operação:

Pedido de postagem n = 0
Pedido de postagem n = 1
Pedido de postagem n = 2
Pedido de postagem n = 3
Pedido de postagem n = 4

Descobrimos que o valor de n impresso na ordem subseqüente é realmente invertido e o valor impresso é de 0 a 4 .
Isso não parece fácil de entender, vamos repetir a ideia:

  • O programa entra e executa a função principal, i = 5, e então chama a função print_num, passando o parâmetro n = 5;
  • O programa entra na função print_num, primeiro executa o julgamento condicional, n = 5, então n-1, n torna-se 4 e printf não é executado;
  • Insira a função print_num novamente, primeiro julgue, n = 4, então n-1, n torna-se 3 e printf não é executado;
  • Insira a função print_num novamente, primeiro julgue, n = 3, então n-1, n torna-se 2 e printf não é executado;
  • Insira a função print_num novamente, primeiro julgue, n = 2, então n-1, n torna-se 1, e printf não é executado;
  • Insira a função print_num novamente, primeiro julgue, n = 1, então n-1, n torna-se 0 e printf não é executado;
  • Neste momento, n não é maior que 0, e print_num no bloco de instrução if não é mais executado. Neste momento, a função printf é executada!
  • Agora n = 0, printf imprime "pós-pedido n = 0", a função print_num contém printf, mas ela não foi impressa após várias vezes de execução. Devo isso a isso, agora tenho que devolvê-la
  • A primeira impressão é a pós-ordem n = 0, a próxima é a pós-ordem n = 1 ...
  • Isso é chamado de recursão pós-pedido! Descobrimos que o código recursivo pós-ordem é executado na ordem inversa !

Resumindo

  • Uma função chama a si mesma internamente, que é chamada de função recursiva
  • O código antes da função recursiva é chamado de recursão de pré-ordem, que é executada sequencialmente
  • O código após a função recursiva é chamado de recursão pós-ordem e é executado na ordem inversa

Acho que você gosta

Origin blog.csdn.net/burningCky/article/details/109585025
Recomendado
Clasificación