数列最值的递归解法

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

 

目录
相关文章
|
5月前
第k小的数(2种快排解法、1种堆排解法)
第k小的数(2种快排解法、1种堆排解法)
27 0
|
8月前
|
算法 C语言 C++
【双指针问题】977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
36 0
|
11月前
leetcode剑指offer11—旋转数组的最小值(二分/边界值)
leetcode剑指offer11—旋转数组的最小值(二分/边界值)
|
11月前
|
机器学习/深度学习
求n的阶乘(递归法和循环法
根据阶乘的计算方法:n!= 1 * 2 * 3*…*n,我们在一个for循环完成 n 次乘法运算。注意因为是连乘,最终阶乘结果可能会非常大所以我们在Fac函数中用 long long 类型的变量来记录阶乘的结果。
|
11月前
利用递归求斐波纳契数列的和
递归的方法更加简单,更容易理解
|
11月前
|
算法 C++
快排例题——第k个数
做道简单一点的题巩固一下
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
|
机器学习/深度学习 人工智能 算法
『递归』汉诺塔和全排列
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下: 第1步:1号盘从A柱移至B柱第2步:2号盘从A柱移至C柱
166 0
|
存储 程序员
裴波那契数列(动态规划)
裴波那契数列(动态规划)
裴波那契数列(动态规划)