数列最值的递归解法

简介: 在看到辗转相除法的递归解法后,不禁想到涉及比较的分治算法、三目运算符和递归简直就是绝配,一眨眼,脑海中就迸出了数列最小值的递归解法,每一个数都与后面数组的最小值相比较,思路有了,动手吧。//辗转相除法   int gcd_division(int a,int b)  {      return b==0?a:gcd_division(b,a%b);   }   一、思路与改进    将数组每一个元素与该元素后数组最小值相比较,最后一个数组元素返回自身,即可得到整个数组的最小值。

在看到辗转相除法的递归解法后,不禁想到涉及比较的分治算法、三目运算符和递归简直就是绝配,一眨眼,脑海中就迸出了数列最小值的递归解法,每一个数都与后面数组的最小值相比较,思路有了,动手吧。

  1. //辗转相除法   
  2. int gcd_division(int a,int b)  
  3. {  
  4.     return b==0?a:gcd_division(b,a%b);   
  5. }  

     

一、思路与改进

    将数组每一个元素与该元素后数组最小值相比较,最后一个数组元素返回自身,即可得到整个数组的最小值。图示如下:

转化成代码就是这样一个函数:

  1. //arr[]:数组  len:数组长度    n:当前下标   
  2. int f(int arr[],int len,int n)  
  3. {  
  4.     if(n == len-1)  
  5.         return arr[n];  
  6.         
  7.     return arr[n]<f(arr,len,n+1)?arr[n]:f(arr,len,n+1);  
  8. }  

    跑一遍:

没问题,不过这递归把f(arr,len,n+1)算了两遍,效率太低了,得改。先求结果,再把结果放入return里。代码如下:

  1. //arr[]:数组  len:数组长度    n:当前下标   
  2. int f(int arr[],int len,int n)  
  3. {  
  4.     if(n == len-1)  
  5.         return arr[n];  
  6.         
  7.     int min = f(arr,len,n+1);  
  8.     return arr[n]<min?arr[n]:min;  
  9. }  

    ok,效率提升了,不过这样的话,三目运算符就只剩下一个比较的操作了,可以再精简一下,定义一个比较元素的宏:MIN(X,Y)

  10. #define MIN(X,Y) ((X<Y)?(X):(Y))  

 

改一下return里的语句:

  1. //arr[]:数组  len:数组长度    n:当前下标   
  2. int f(int arr[],int len,int n)  
  3. {  
  4.     if(n == len-1)  
  5.         return arr[n];  
  6.         
  7.     int min = f(arr,len,n+1);  
  8.     return MIN(min,arr[n]);  
  9. }  

    搞定~

 

源代码:

  1. #include <stdio.h>  
  2. #define N 10  
  3. #define MIN(X,Y) ((X<Y)?(X):(Y))  
  4.     
  5. int f(int arr[],int len,int n)  
  6. {  
  7.     if(n == len-1)  
  8.         return arr[n];  
  9.         
  10.     int min = f(arr,len,n+1);  
  11.     
  12.     return MIN(min,arr[n]);  
  13. }  
  14.     
  15. int main (void)  
  16. {  
  17.     int arr[N] = {2,4,1,3,5,6,7,8,-11};  
  18.         
  19.     int min = f(arr,N,0);  
  20.     printf("%d ",min);  
  21.         
  22.     return 0;  
  23. }  

 

目录
相关文章
|
缓存 监控 网络性能优化
从内核的视角观测容器——SysOM 容器监控
从内核的视角观测容器——SysOM 容器监控
|
8月前
|
人工智能 数据可视化 数据挖掘
2026年免费BI产品怎么选?功能强、易上手、安全可靠的推荐
2026年全球BI市场达282.6亿美元,AI驱动分析成主流。本文基于最新数据,聚焦功能、易用性与安全性,重点推荐瓴羊Quick BI——阿里云旗下唯一连续6年入选Gartner魔力象限的国产BI。其永久免费基础版支持多源接入、智能小Q自然语言分析、50+图表及企业级安全,零门槛实现数据可视化。(239字)
|
7月前
|
人工智能 API 网络安全
打造专属AI军团:OpenClaw多Agent智能体配置+阿里云/本地部署+API配置解析
2026年,OpenClaw(曾用名Clawdbot)的多Agent架构彻底打破了单一智能体的能力局限,让用户能够像组建真实团队一样,创建分工明确、协同作战的AI军团。无论是独立创始人搭建“战略+商业+营销+开发”的全能小队,还是量化研究者组建专业的研究团队,通过合理的角色划分、模型分配与消息路由配置,都能实现“全天候待命、专业化分工”的高效协作。
2613 4
|
机器学习/深度学习 人工智能 自然语言处理
自监督学习:引领机器学习的新革命
自监督学习的思想可以追溯到几年前,最早是在图像处理领域被提出。随着深度学习的快速发展,研究者们逐渐认识到未标注数据的巨大潜力。尤其是在大规模数据集的爆炸式增长下,获取标注数据的成本越来越高,而利用自监督学习的方法来减少对标注数据的依赖变得越来越重要。
|
12月前
|
编解码 图形学 异构计算
《让青岚剑影有国漫分镜感:RPG特效粒子技术实战指南》
本文分享东方仙侠国漫RPG中,男主技能“青岚剑影”特效还原手绘分镜感的实战经验。开发团队摒弃纯帧动画与纯物理粒子方案,采用“笔触路径约束+手绘纹理粒子”混合思路,先联合美术搭建含200组国漫分镜特征的粒子库,拆分剑影运动阶段并设置对应参数;再通过碰撞范围检测解决穿模,用材质合批与LOD优化渲染性能,使移动端帧率稳定58-60帧。
568 0
|
5G vr&ar UED
载波聚合:赋能5G高速率通信的关键技术
载波聚合:赋能5G高速率通信的关键技术
4227 5
|
存储 Web App开发 数据采集
|
人工智能 自然语言处理 机器人
用Python构建你的第一个聊天机器人
【10月更文挑战第7天】在这篇文章中,我们将一起探索如何利用Python编程语言和AI技术,一步步打造一个基础的聊天机器人。无论你是编程新手还是有一定经验的开发者,都能通过这个指南获得启发,并实现一个简单的对话系统。文章将引导你理解聊天机器人的工作原理,教你如何收集和处理用户输入,以及如何设计机器人的响应逻辑。通过动手实践,你不仅能够学习到编程技能,还能深入理解人工智能在语言处理方面的应用。
1023 0
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
1937 1
|
SQL
sqlserver行转列和列转行
sqlserver行转列和列转行
923 1