Função recursiva C (1): uma breve introdução
índice
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