递归函数以求和在给定范围内的数组中的连续子序列数

时间:2018-06-29 06:23:45

标签: c arrays recursion subsequence

我写了这个code。这个想法是将array分成2部分,并找到满足给定条件的子序列数。现在也可以有一个包含subarrays中的元素的子序列。因此,我编写了crossub函数。

subarray函数正在无限loop上进行(它不断打印调试语句"BBBBBBBB")。我花了一些时间,但我想我需要一些帮助。

注意:编程新手。我知道代码很烂。但是我越来越好了。

#include <stdio.h>
#include <stdlib.h>

void crossub(int * A,int mid, int start, int end, int lbound, int ubound, int **k)
{
    int leftsum  = A[mid];
    int crossum;
    int rightsum = 0;
    int i;int j;
    for(i = mid -1; i>=0; i--)
    {
        leftsum = leftsum + A[i];
        for(j = mid +1; j <=end; j++)
        {
            rightsum = rightsum + A[j];
            crossum = rightsum + leftsum;
            if (lbound <= crossum && crossum <= ubound) k++;
            else if(crossum > ubound) break;
        }
    }
    return;
}
void subarray(int * A, int start, int end, int lbound, int ubound, int *count)
{
    printf("BBBBBBBBB ");
    if(start == end) 
    {
        if(lbound <= A[start] && A[start] <= ubound)
        {
            count++;
        }
       return;
    }
    int **k; int mid;
    k = &count;
    while (start <= end)
    {
    mid = (start + end)/2;
    subarray(A, start, mid,lbound,ubound,count);
    subarray(A, mid +1, end,lbound,ubound,count);
    crossub(A, mid, start, end, lbound,ubound,k);
    }
    return;
}

int numRange(int* A, int n, int lbound, int ubound) 
{
    // printf("AAAAAAAAAAA");
    int p = 0;
    int *count;
    count = &p;
    subarray(A, 0, n-1,lbound,ubound, count);

    return p;
}
int main()
{
    int A[] = {30, 5,1,0,2, 15,20,25};
    int n = sizeof(A)/sizeof(A[0]);
    printf("%d", n);
    int lbound = 6; int ubound = 8;
    int k = numRange(A, n,lbound, ubound);
    printf("%d ", k);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

我不确定递归是否在这里有用。这里的方法是始终有一个范围并检查其总和。初始范围应包含单个第一项(范围可以通过开始和结束索引定义),sum的初始值应等于的值。进一步处理是:

  • 如果总和小于所需数量,请扩大范围以增加其结束索引,并将新项目的值添加到该范围总和的当前值;
  • 如果您的总和大于所需的总和,请减小范围以增加其起始索引并从范围的总和中减去排除项的值;
  • 如果您的款项还算可以,请退还。

处理范围:

  • 如果总和小于所需的数量,并且由于指向要查看的数组中的最后一项而无法增加其最终索引,则可能会返回结果,表明没有范围满足您的要求;
  • 如果总和大于要查找的总和,并且由于指向数组中的最后一项而无法增加其起始索引,则您可能还会返回相同的“无答案”结果。

我确定没有使用“分而治之”策略处理范围的有效方法。

答案 1 :(得分:1)

关于无限循环,问题出在subarray函数中,即:

while (start <= end)
{
    mid = (start + end)/2;
    subarray(A, start, mid,lbound,ubound,count);
    subarray(A, mid +1, end,lbound,ubound,count);
    crossub(A, mid, start, end, lbound,ubound,k);
}

如您所见,这将永远持续下去,因为您永远不会更改start / end的值,因此您将在同一部分继续调用subarray

尽管,如第一个答案所述,这可能不是最佳方法,但是您可以删除while循环,看看它是否有效,即使它可能不是最佳解决方案。