C-递归原理

Posted on 2024-02-11 17:35  牛man  阅读(8)  评论(0编辑  收藏  举报
  • 递归是什么

          函数调用自己本身这种调用过程称为递归

  • 递归原理

          函数调用本质就是入栈出栈的过程,先入后出;可以假设有一个函数调用链,不过实际使用fun2,fun3,fun4都是fun1

      

 

 

  • 递归实例

          可以使用循环的地方通常可以使用递归,递归方法简单,但效率没有递归高,因为每次递归都会创建一些变量放入栈中,递归调用的数量受限于内存空间

      

#include<stdio.h>
void up_and_down(int n);
int main(void)
{
    up_and_down(1);
    return 0;
 }
 
 void up_and_down(int n)
 {
     printf("level %d: n location %p\n",n, &n);
    if (n < 4)
     up_and_down(n+1);
    printf("LEVEL %d: n location %p\n", n, &n);
} 

运行结果:

level 1: n location 000000000062FE30
level 2: n location 000000000062FE00
level 3: n location 000000000062FDD0
level 4: n location 000000000062FDA0
LEVEL 4: n location 000000000062FDA0
LEVEL 3: n location 000000000062FDD0
LEVEL 2: n location 000000000062FE00
LEVEL 1: n location 000000000062FE30

 

 递归在处理倒序方便,如下实例,输入十进制用二进制表示的算法

#include<stdio.h>
void print_ocl_to_hex(int m);
void to_binary(int m); 
#define MAX_SIZE  100 
int a[MAX_SIZE];
int main(void)
{
    int number;
    printf("please input a octal number :");
    scanf("%d",&number);
//    to_binary(number);
    print_ocl_to_hex(number);
    return 0;
 }
 
 void print_ocl_to_hex(int m)
{
    int i,j;
    if (m ==0)
    {
        printf("%d\n", m);
    }
    else
    {
        for (i = 0; m > 0; i++)
        {
            a[i] = m % 2;
            m = m / 2;
        } 
        for (j = (i-1); j >= 0; j--)
        {
            printf("%d", a[j]);
        }
    }

} 

void to_binary(int m)
{

    int n;
    n = m    % 2;
    m = m / 2;

    if (m != 0)
       to_binary(m);
       
    printf("%d", n);

/*     int r;

    r = m % 2;
    if (m >=2)
    {
       to_binary(m/2);
    }
    putchar(r == 0 ?'0':'1'); */ 
}
  • 递归分类

          尾递归:把递归调用置于函数末尾,return语句之前。相当于循环

          双递归:函数每一条递归都要调用本身两次