当前位置 博文首页 > cumtchw:c语言用递归判断一个数组是递增还是递减
目录
1.方法一:中间有相等还算有序
2.方法二:中间有相等则算作无序
该方法在遇到有相等的值时,不影响最终判断结果。例如1,2,3,3,4这种还是会判断为升序。
#include <stdio.h>
/* ordered返回四个状态:2:常数列、1:递增、0:无序、-1:递减*/
int ordered(int *a, int n)
{
if(n == 1)return 2;
int t = (a[0]<a[1])-(a[0]>a[1])+2*(a[0]==a[1]);
int order = ordered(a+1, n-1);
if(t*order == 0 || t*order == -1)return 0;//无序的情况
if(t > order)t = order; //取min(t, order),使得常数列与有序数列连接,最后属性是有序数列
return t;
}
int main(int argc)
{
int a1[]={1,2,3,4};
int a2[]={4,3,2,1};
int a3[]={1,2,3,3,3,4};
int a4[]={4,3,3,3,2,1};
int a5[]={1,2,3,3,4,2,2,1};
printf("ordered(a1):%d\n", ordered(a1,sizeof(a1)/sizeof(int)));
printf("ordered(a2):%d\n", ordered(a2,sizeof(a2)/sizeof(int)));
printf("ordered(a3):%d\n", ordered(a3,sizeof(a3)/sizeof(int)));
printf("ordered(a4):%d\n", ordered(a4,sizeof(a4)/sizeof(int)));
printf("ordered(a5):%d\n", ordered(a5,sizeof(a5)/sizeof(int)));
}
测试结果:
这种情况在遇到1,2,3,3,4时,直接判断为无序。
#include "stdio.h"
//升序就输出return 1,降序输出-1,乱序输出0
int order(int dat[ ],int n)
{
int t=dat[1]-dat[0];
int r=t>0?1:(t<0?-1:0);
if (r==0||n<=2) // r==0 时,不管N多少,都不再递归下去,这大大优化了
return(r);
int r1=order(dat+1,n-1);
return (r1==r?r:0);
}
参考文献:https://zhidao.baidu.com/question/559001788.html
cs