使用递归直接输出结果的最大和连续子数组

时间:2015-07-10 02:05:50

标签: c arrays recursion dynamic-programming contiguous

可以使用递归找到最大的和的连续子数组,这样函数就会直接返回输出。

下面是我的解决方案,其中我存储以每个索引结尾的max子数组,然后在print()函数中找到最大的子数组。但是,我想要以下

  1. 使用递归
  2. 使用递归函数直接输出最终结果。
  3. 我的代码使用递归函数和帮助器print()函数来查找这些数字中最大的

    #include <stdio.h>
    
    //int a[] = {-6,60,-10,20};
    int a[] =  {-2, -3, 4, -1, -2, 1, 5, -3};
    int len = sizeof(a)/sizeof(*a);
    int maxherearray[10];
    
    int main(void)
    {
     fun(len-1);
     printf("max sub array == %d\n",print(maxherearray));
    
     printf("\n");
     return 0;
    }
    
    int fun(int n)
    {
     if(n==0)
      return a[n];
    
     maxherearray[n] = max(a[n], a[n]+fun(n-1));
     return maxherearray[n];
    }
    
    int max(int a, int b)
    {
     return (a > b)? a : b;
    }
    

    编辑:发布我错过的print()函数

    //Please make sure that #include <limits.h> is added
    int print(int a[])
    {
     int i = 0;
     int largest = INT_MIN;
     printf("largest == %d\n",largest);
    
     for(i=0;i<len;i++)
     {
      if(a[i] > largest)
       largest = a[i];
     }
     return largest;
    }
    

2 个答案:

答案 0 :(得分:2)

通常,您的算法逻辑正常。就像,

  1. f(0) = a(i);
  2. f(i) = max(f(i-1) + a(i), a(i));,获取中间结果数组
  3. max(0, f(1), f(2), ... , f(n-1)),获取最终的max_sub结果
  4. 你为#2设计了一个名为fun的函数,为#3设计了一个a helper print()

    现在,(我猜)你想要的是将#2和#3结合在一起,即利用#2的中间结果来避免额外的计算/内存空间。就原始算法逻辑而言,这里有一些可能的方法,例如

    • fun中添加参数以保持max_sub结果

      int fun(int n, int *result)// add int *result to return max_sub
          {
            int max_here = 0;
            if(n==0){
               return a[n];
            }
      
            max_here =  max(a[n],a[n]+fun(n-1, result)); 
            *result  =  max(*result, max_here);
      
            return max_here; 
           }
      //...
      int main(void)
      {
         int result = 0;
         fun(len-1, &result);
         printf("max sub : %d\n", result);
      }     
      
    • 使用全局变量(哦!)及时获取max_sub

      int g_maxhere = 0;
      int fun2(int n)
      {
         if(n==0){
            return a[n];
         }
      
         g_maxhere = max(g_maxhere, max(a[n],a[n]+fun2(n-1)));
      
         return max(a[n], a[n]+fun2(n-1));
      }
      //...
      int main(void)
      {
        fun2(len-1);
        printf("max sub:%d\n",g_maxhere)
      } 
      

    事实上,使用辅助函数的原始解决方案可以使您的算法更清晰。

答案 1 :(得分:1)

引入两个全局变量int main(void){ int i =0; char a2[] = "aaaa"; char a1[] = "bbb"; printf("%lu\n",sizeof(a2)); printf("%lu\n",sizeof(a1)); printf("%c\n",a2[4]); printf("---\n"); for(i =0; i < sizeof(a2); i++){ a2[i]=a1[i]; printf("%c\n", a2[i]); } printf("---\n"); printf("%c\n", a2[4]); return 0; } start_idx来跟踪最大的连续子数组的开始和结束索引。在递归函数中相应地更新这些变量。

end_idx