递归小结(基础题目斐波那契,汉诺塔等)(下)

简介: 递归小结(基础题目斐波那契,汉诺塔等)

7.递归实现找到第n个斐波那契数


①.递归实现


递归题目里估计最著名的就是斐波那契数了,但是递归的写法其实并不高效,笔者进行了修改,使得各位可以看到它的弊端

//仅仅表达思想递归:
//斐波那契数列 1 1 2 3 5 8 13 21 34 55
int count = 0;
int Fib(int n)
{
  if (n == 4)
  count++;//计算重复度,重复度过大,时间浪费
  if (n <= 2)
  {
  return 1;
  }
  else
  return Fib(n - 1) + Fib(n - 2);//效率低是因为重复很多
}
int main()
{
  //第n个斐波那契数
  int n = 0;
  scanf("%d", &n);
  int fib = Fib(n);
  printf("%d\n", fib);
  printf("%d\n", count);
  return 0;
}


1669211808401.jpg


第三个数就是笔者测试的(笔者输入的是4)重复计算的个数高达接近20万.可见这个递归实现有多么低效。而且仅仅对于第50个数就需要很长时间计算。可以说十分鸡肋。


②非递归


int Fib(int n)
{
  int a = 1;
  int b = 1;
  int c = 0;
  while (n >= 3)
  {
  c = a + b;
  a = b;
  b = c;
  n--;//进来几次,算几次
  }
  return c;
}
int main()
{
  //第n个斐波那契数
  int n = 0;
  scanf("%d", &n);
  int fib=Fib(n);
  printf("%d\n", fib);
  return 0;
}

这个非递归实现还是挺有意思的。笔者利用图解可以让大家更加理解。


1669211825195.jpg


8.青蛙跳台阶问题


青蛙每次可以选择跳一个或者两个台阶,那么青蛙要跳到第n个台阶需要多少种跳法呢?


我们可以简单分析一下:


1669211839654.jpg


那么代码就可以实现:

int fib(int n)
{
    if (n <= 2)
        return n;
    else
    {
        return fib(n - 1) + fib(n - 2);
    }
}
int main() 
{
    int n = 0;
    scanf("%d", &n);
    printf("%d", fib(n));
    return 0;
}


9.逆向输出字符串


逆向输出字符串

//常规实现
void reverse_string(char* str)
{
  int count = 0;
  char* arr = str;
  while (*str != '\0')
  {
  count++;
  str++;
  }
  int left = 0;
  int right = count - 1;
  while(left <= right)
  {
  char tmp = arr[left];
  arr[left] = arr[right];
  arr[right] = tmp;
  left++;
  right--;
  }
}

递归实现:

#include<string.h>
void reverse_string(char* str)
{
  int count = strlen(str);
  char tmp = str[0];
  str[0] = str[count - 1];
  str[count - 1] = '\0';
  if (strlen(str+1) >= 2)
  {
  reverse_string(str + 1);
  }
  str[count - 1] = tmp;
}
int main()
{
  char arr[] = "qwertyu";
  reverse_string(arr);
  printf("%s\n", arr);
  return 0;
}


这个递归是如何操作的呢?首先笔者认为要根据这个字符串思考常规实现是如何转化为递归实现。很明显,基本思想是俩俩交换。见图


1669211874215.jpg


10.计算排列数


输入两个数,计算A(n上)(m下)😂。


#include<stdio.h>
int arrange(int n,int m)
{
    if(m)
    {
        return n*arrange(n-1,m-1);
    }
    else
        return 1;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int ret=arrange(n,m);
    printf("%d\n",ret);
    return 0;
}


1669211893062.jpg


11.汉诺塔问题(Hanoi)


题目笔者就不多赘述了。


图解:


1669211919123.jpg


代码实现:


//汉诺塔问题
void move(char pos1, char pos2)
{
  printf("%c->%c ", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2,char pos3)
{
  if (n == 1)
  {
  move(pos1, pos3);
  }
  else
  {
  Hanoi(n - 1, pos1, pos3, pos2);
  move(pos1, pos3);
  Hanoi(n - 1, pos2, pos1, pos3);
  }
}
int main()
{
  //笔者为了直观展示结果,多加了几个,其实只需一个就可以了
  int n,m,k;
  scanf("%d", &n);
  Hanoi(n, 'A','B', 'C');
  printf("\n");
  scanf("%d", & m);
  Hanoi(m, 'A', 'B', 'C');
  printf("\n");
  scanf("%d", &k);
  Hanoi(k, 'A', 'B', 'C');
  return 0;
}

对比图一下:


1669211934917.jpg


可以发现是可以吻合的。但是注意汉诺塔问题n值不能过大,通过图解诸君已经可以发现它的执行也是比较繁琐的,需要2^n-1次,指数爆炸还是挺恐怖的。


通过上面几个简单的题目就可以发现递归的好处,化繁为简。笔者认为,递归本身是比较抽象的,建议诸君在做这类题目的时候可以通过画图的形式进行剖析,那么就比较好解。要注意递归的限制条件和它的循环是怎么设计去接近这个条件,这一点是比较重要的。


但是递归也是有它的弊端:


递归层数太深会出现栈溢出的。

解决方案


1.递归改为非递归


2.非静态改为静态//不在栈上挪到静态区。

相关文章
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第10天】 随着人工智能技术的飞速发展,基于深度学习的图像识别技术已成为自动驾驶系统不可或缺的核心组成部分。该技术通过模拟人类视觉系统处理与理解环境信息的过程,赋予自动驾驶车辆高度准确和实时的环境感知能力。本文首先概述了深度学习在图像识别领域的关键技术与方法,包括卷积神经网络(CNN)及其变体、循环神经网络(RNN)等,并探讨了这些技术在自动驾驶系统中的具体应用,如车辆检测、行人识别、交通标志识别以及道路场景理解。随后,文章分析了当前技术面临的主要挑战,包括数据集的多样性与质量、模型泛化能力、实时处理要求及系统的鲁棒性问题。最后,展望了未来图像识别技术在自动驾驶领域的发展趋势,特
|
5天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
11天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
2天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
10天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
5天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
477 14
|
4天前
|
编解码 文字识别 算法
一张图能装下“千言万语”?DeepSeek-OCR 用视觉压缩长文本,效率提升10倍!
一张图能装下“千言万语”?DeepSeek-OCR 用视觉压缩长文本,效率提升10倍!
374 10
|
10天前
|
编解码 自然语言处理 文字识别
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大
凌晨,Qwen3-VL系列再添新成员——Dense架构的Qwen3-VL-8B、Qwen3-VL-4B 模型,本地部署友好,并完整保留了Qwen3-VL的全部表现,评测指标表现优秀。
680 7
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大