数列最值的递归解法

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

 

目录
相关文章
|
7月前
|
人工智能 分布式计算 算法
【动态规划】【二分查找】【去重】730. 统计不同回文子序列
【动态规划】【二分查找】【去重】730. 统计不同回文子序列
|
2月前
|
存储
【动态规划】子数组系列
本文介绍了多个动态规划问题及其解决方案,包括最大子数组和、环形子数组的最大和、乘积最大子数组、乘积为正数的最长子数组长度、等差数列划分、最长湍流子数组、单词拆分及环绕字符串中唯一的子字符串。通过详细的状态定义、转移方程和代码实现,帮助读者理解每类问题的核心思路与解题技巧。
58 2
|
7月前
|
算法 测试技术 C#
【折半处理 二分查找】1755. 最接近目标值的子序列和
【折半处理 二分查找】1755. 最接近目标值的子序列和
|
7月前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
62 0
|
7月前
|
算法
回溯-求出数组的所有子序列【学习算法】
回溯-求出数组的所有子序列【学习算法】
53 0
|
算法 C语言 C++
【双指针问题】977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
57 0
利用递归求斐波纳契数列的和
递归的方法更加简单,更容易理解
汉诺塔问题, 用递归方法求集合中的中位数
汉诺塔问题, 用递归方法求集合中的中位数
PAT乙级 (二分) 1030.完美数列
PAT乙级 (二分) 1030.完美数列
98 0