当前位置 博文首页 > cumtchw:c语言用递归判断一个数组是递增还是递减

    cumtchw:c语言用递归判断一个数组是递增还是递减

    作者:[db:作者] 时间:2021-07-12 18:44

    目录

    1.方法一:中间有相等还算有序

    2.方法二:中间有相等则算作无序


    1.方法一:中间有相等还算有序

    该方法在遇到有相等的值时,不影响最终判断结果。例如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)));
    }

    测试结果:

    2.方法二:中间有相等则算作无序

    这种情况在遇到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
    下一篇:没有了