天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用递归方法求一个数组的最小值.

Posted on 2012-05-09 00:50 hoshelly 阅读(3026) 评论(0)  编辑 收藏 引用 所属分类: Programming
输入
第一行包含一个整数T,表示有T组测试数据。对于每组测试数据:第一行包含一个整数N,表示有N个元素(N不大于50),第二行包含N个整数,表示这N个元素(各个元素的值小于1000)。

输出
对于每组测试数据,输出一行,包含一个数据即返回的最小值。

样例输入
2
3
3 2 1
5
-1 5 3 -2 4
样例输出
1
-2

解法一:
将一个数组,分成两部分,然后求出两部分中的最小值,当然这里有一个要考虑的情况是,然后元素的个数为奇数个的时候,我们可以将其分为三部分,中间元素,前半部分,后半部分。然后使用递归的方法,求出数组元素中的最小值。

#include<stdio.h>
int Min(int a[],int n)
{
    int a1,a2,a3;
    if(n==1)
        return a[0];
    if(n%2==0)
    {
        a1=Min(a,n/2);
        a2=Min(a+n/2,n/2);
        if(a1>a2)
            return a2;
        else
            return a1;
    }
    else
    {
        a1=Min(a,n/2);
        a2=Min(a+n/2+1,n/2);
        a3=a[n/2];
        if(a1>a2)
        {
            if(a2>a3)
                return a3;
            else
                return a2;
        }
        else
        {
            if(a1>a3)
                return a3;
            else
                return a1;
        }
    }
    
}


int main()
{
    int n,m,i;
    int a[50];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n",Min(a,m));
    }
    return 0;
}

解法二:
代码如下
#include<stdio.h>
int Min(int a[],int n)
{
    if(n==0)
        return a[0];
    else
        return ((Min(a,n-1)<a[n])? Min(a,n-1):a[n]);
    
}


int main()
{
    int n,m,i;
    int a[50];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n",Min(a,m-1));
    }
    return 0;
}



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理