C递归函数(一):简单介绍

C递归函数(一):简单介绍

普通函数调用

我们先来看一个简单的函数调用例子:

#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;
}

运行结果:

n = 5

先序递归函数

ok,现在我们对这个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;
}    

运行结果:

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

我们现在来分析下:

  • 程序进入运行到main函数,i=5,然后调用print_num函数,传入参数n=5;
  • 程序进入print_num函数,先进行条件判断,n=5,所以先打印n=5,然后n-1,n变为4;
  • 再一次进入到print_num函数,同上,先判断,n=4,所以打印n=4,然后n-1,n变为3;
  • 重复以上操作,分别打印n=3,n=2,n=1,这时候n-1,n变为0;
  • 再一次进去到print_num函数,判断n是否大于0,若不大于0,接下来不进行任何操作,print_num函数结束
    我们把这种递归函数叫先序递归

后序递归函数

我们再来改造下之前的代码:把printf放在递归之后

#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;
}    

运行结果:

后序n = 0
后序n = 1
后序n = 2
后序n = 3
后序n = 4

我们发现后序打印的n的值居然是倒过来的,并且打印的值是0到4
这似乎不太好理解,我们来屡一下思路:

  • 程序进入运行到main函数,i=5,然后调用print_num函数,传入参数n=5;
  • 程序进入print_num函数,先进行条件判断,n=5,然后n-1,n变为4,没有执行printf;
  • 再一次进入到print_num函数,先判断,n=4,然后n-1,n变为3,没有执行printf;
  • 再一次进入到print_num函数,先判断,n=3,然后n-1,n变为2,没有执行printf;
  • 再一次进入到print_num函数,先判断,n=2,然后n-1,n变为1,没有执行printf;
  • 再一次进入到print_num函数,先判断,n=1,然后n-1,n变为0,没有执行printf;
  • 这个时候n不大于0了,不再执行if语句块里的print_num,这个时候来执行printf函数!
  • 现在n=0,printf打印出"后序n=0",print_num函数里面是包含printf的,但是之前执行了几次都没有打印,欠在那了,现在要还回来
  • 最开始的打印是后序n=0,接下来就是后序n=1…
  • 这就叫后序递归!我们发现后序递归的代码是逆序执行的

总结

  • 函数在内部调用自己,就叫做递归函数
  • 在递归函数之前的代码叫先序递归,是顺序执行的
  • 在递归函数之后的代码叫后序递归,是逆序执行的

猜你喜欢

转载自blog.csdn.net/burningCky/article/details/109585025