C语言——递归算法

一、什么是递归

简单来说递归是一个函数直接或者间接的调用自身的一种方法,他通常将一个大型问题层层装换为相似的规模较小的问题来求解。

举个例子:比如在字典中查询一个词语,当查到这个词的解释后,发现他所给的解释出现了不懂的词语,那么我就需要继续查询,一直查询到懂了为止,当查询结束后,也就相当于递归结束了。

 

用递归解决问题需要具备哪些条件?

  1. 递归的表达式,也可以 来理解为你发现的规律;

  2. 递归出口,也可以理解为必须有一个明确的结束条件;

注意:递归的目的是为了让问题的规模变小,递归层次过多会导致栈溢出,且效率不高

再举个反面例子,从前有座山,山里有座庙,庙里有个老和尚会讲故事,讲的什么故事啊?讲的是从前有座山,山里有座庙,庙里有个老和尚会讲故事,讲的什么故事啊?从前有座山,山里有座庙,庙里有个老和尚会讲故事,讲的什么故事啊?

这是个典型的反面教材,想到那个鱼递归找不到终止条件,就会产生死循环;

二、递归的几个经典题目

1. 斐波那契数列

斐波那契数列是:0,1,1,2,3,5,8,13,21,34,55,89,144……依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。

那么用递归的方法怎么求解呢?

/*
    迭代法
*/
void fun_1()
{
    static int n = 0;//索引变量
    static int a_ary[40];
    a_ary[0] = 0;//n=0;
    a_ary[1] = 1;//n=1;
    a_ary[2] = 1;//n=2;
    a_ary[3] = 2;//n=3;
    a_ary[4] = 3;//n=4;
    a_ary[5] = 5;//n=5;
    a_ary[6] = 8;//n=6;
    // ...
    
​
    for (n = 2; n < 40; n++)
    {
        a_ary[n] = a_ary[n-1] + a_ary[n-2];
        printf("%d\r\n", a_ary[n]);
    }
}
/*
递归法
*/
int fun_2(int n)
{
    if (n <= 1)  //递归出口
        return n;
    else
        return  fun_2(n - 1) + fun_2(n - 2);//向递归出口方向靠近自身的调用
}

很好看出规律,规律就是当前项等于前两项的和;

2. 倒叙打印字符串

//倒叙打印字符串
void print_str_reverse(char *str)
{
    if (!*str)
        return;
    print_str_reverse(str + 1);
​
    putchar(*str);
}

传为参数为一个char型指针,并且每进入一次函数就判断一次当前指针为空指针,如果当前指针为空指针说明已经已经指向字符串尾部,此时return到上一层函数打印输出,由于栈的特点是先进后出的所以打印字符的时候是倒叙的。

3. n的阶乘n!

n!一共分为两种情况

  1. n=0 n!=1

  2. n>0 n*(n-1)

int fun_3(int n)
{
    if (n==0)
    {
        return 1;
    }
    else if (n>0)
    {
        return n * fun_3(n - 1);
    }
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值