C 递归中的最大值

C 递归中的最大值,c,recursion,C,Recursion,我有一个家庭作业: 设Pi为索引i中arr的元素。如果存在一个索引j(j>=i),那么我们说索引i处于“良好位置”,因此将Pi+1…Pj中的元素求和得到索引i。换句话说,如果从该索引开始的元素序列在求和时生成索引,则该索引处于“良好位置” 我们将一个放置良好的索引的“放置良好的长度”定义为j-i+1–当求和时表明该索引放置良好的序列长度。索引可能包含多个元素序列。在这种情况下,“放置良好的长度”是将索引定义为“放置良好”的各种序列的最大长度。 “最大井位长度”是arr中所有井位指数的井位长度之间

我有一个家庭作业:

设Pi为索引i中arr的元素。如果存在一个索引j(j>=i),那么我们说索引i处于“良好位置”,因此将Pi+1…Pj中的元素求和得到索引i。换句话说,如果从该索引开始的元素序列在求和时生成索引,则该索引处于“良好位置”

我们将一个放置良好的索引的“放置良好的长度”定义为j-i+1–当求和时表明该索引放置良好的序列长度。索引可能包含多个元素序列。在这种情况下,“放置良好的长度”是将索引定义为“放置良好”的各种序列的最大长度。 “最大井位长度”是arr中所有井位指数的井位长度之间的最大值

如果数组中没有索引正确放置,则认为最大正确放置长度为零

这是我写的代码(不起作用):

int longestIndexHelper(int arr[],int i,int cur,int sum,int标志)
{

如果((arr[i]==115)| |(i假设您的
longestIndex
函数找到给定
length
参数的“最大合理长度”。那么它会删除它(
h
l
不会存储或返回到任何位置,是吗?),并以减少的
长度调用自身。因此该函数将始终返回
longestIndex(arr,0)
longestIndex(arr,-1)
的结果,该结果将始终为0


编辑:并且
longestIndexHelper
函数也只能返回0。

假设您的
longestIndex
函数为给定的
length
参数找到了“最大合理长度”。然后它会删除它(
h
l
不会存储或返回到任何地方,是吗?),并以减少的
长度调用自身。因此该函数将始终返回
longestIndex(arr,0)
longestIndex(arr,-1)
的结果,该结果将始终为0


编辑:并且
longestIndexHelper
函数也只能返回0。

问题似乎是您需要实现两个“循环”通过递归;一个是从给定索引开始的循环,并在循环过程中对值求和,跟踪该起始索引的最大放置长度。另一个是尝试每个可能的起始索引的循环。我看到您的助手函数执行前者。您似乎打算调用函数执行后者,但它没有机制来跟踪到目前为止找到的最大值或要检查的索引,与输入数组的长度分开。为此,您可能需要创建另一个帮助函数来递归所有可能的起始索引。尽管我会通过扩展现有的帮助函数来实现这一点,类似于:

int _helper( int arr[], int len, int start, int cur, int sum, int max )
{
    if (start >= len) {
        /* game over, thanks for playing */
        return max;
    } else if (cur >= len) {
        /* try another starting index */
        return _helper( arr, len, start + 1, start + 1, 0, max );
    } else if ( sum + arr[cur] == start && max < cur - start + 1 ) {
        /* found a longer well placed length */
        return _helper( arr, len, start, cur + 1, sum + arr[cur], cur - start + 1 );
    } else {
        /* bzzzt.  try a longer length at this starting index */
        return _helper( arr, len, start, cur + 1, sum + arr[cur], max );
    }
}

int max_well_placed_length( int arr[], int len )
{
    return _helper( arr, len, 0, 0, 0, 0 );
}

#include <stdio.h>

int main(int argc, char **argv) {
    int arr[100];
    int len = 0;
    if (argc > 100) return 1;

    while (--argc) sscanf(*++argv, "%d", &arr[len++]); 

    printf("max well placed length: %d\n", max_well_placed_length(arr, len));
    return 0;
}
int\u助手(int-arr[],int-len,int-start,int-cur,int-sum,int-max)
{
如果(开始>=len){
/*游戏结束了,谢谢你玩*/
返回最大值;
}else if(cur>=len){
/*尝试另一个起始索引*/
返回辅助对象(arr、len、start+1、start+1、0、最大值);
}否则如果(总和+arr[cur]==开始和最大值100)返回1;
而(--argc)sscanf(*++argv、%d“,&arr[len++]);
printf(“最大放置长度:%d\n”,最大放置长度(arr,len));
返回0;
}

问题似乎是您需要实现两个“循环”通过递归;一个是从给定索引开始的循环,并在循环过程中对值求和,跟踪该起始索引的最大放置长度。另一个是尝试每个可能的起始索引的循环。我看到您的助手函数执行前者。您似乎打算调用函数执行后者,但它没有机制来跟踪到目前为止找到的最大值或要检查的索引,与输入数组的长度分开。为此,您可能需要创建另一个帮助函数来递归所有可能的起始索引。尽管我会通过扩展现有的帮助函数来实现这一点,类似于:

int _helper( int arr[], int len, int start, int cur, int sum, int max )
{
    if (start >= len) {
        /* game over, thanks for playing */
        return max;
    } else if (cur >= len) {
        /* try another starting index */
        return _helper( arr, len, start + 1, start + 1, 0, max );
    } else if ( sum + arr[cur] == start && max < cur - start + 1 ) {
        /* found a longer well placed length */
        return _helper( arr, len, start, cur + 1, sum + arr[cur], cur - start + 1 );
    } else {
        /* bzzzt.  try a longer length at this starting index */
        return _helper( arr, len, start, cur + 1, sum + arr[cur], max );
    }
}

int max_well_placed_length( int arr[], int len )
{
    return _helper( arr, len, 0, 0, 0, 0 );
}

#include <stdio.h>

int main(int argc, char **argv) {
    int arr[100];
    int len = 0;
    if (argc > 100) return 1;

    while (--argc) sscanf(*++argv, "%d", &arr[len++]); 

    printf("max well placed length: %d\n", max_well_placed_length(arr, len));
    return 0;
}
int\u助手(int-arr[],int-len,int-start,int-cur,int-sum,int-max)
{
如果(开始>=len){
/*游戏结束了,谢谢你玩*/
返回最大值;
}else if(cur>=len){
/*尝试另一个起始索引*/
返回辅助对象(arr、len、start+1、start+1、0、最大值);
}否则如果(总和+arr[cur]==开始和最大值100)返回1;
而(--argc)sscanf(*++argv、%d“,&arr[len++]);
printf(“最大放置长度:%d\n”,最大放置长度(arr,len));
返回0;
}

i、cur、sum和flag用于什么?使用更具描述性的变量名。您可以先尝试一个更简单的问题,比如在数组中查找最大值。“arr[i]==115”中的“115”是从哪里来的