递归函数减去

Recursive function to subtract

此函数获取数字序列,直到用户输入 -1。它应该 return index(mod3)=0 处的数字总和减去其他索引中的数字。

例如:

9 2 4 7 8 1 3 -1 

该函数首先对索引处可被三整除的所有数字求和。所以 sum1 应该是 5 因为 4 在第 3 个索引处,1 在第 6 个索引处,所有其他索引总和为 sum2。然后它应该从另一个中减去一个:sum1 - sum2 并且输出应该是 -24i.e., sum1 - sum2 = 5 - 29 = -24)

我写了这段代码,但我不明白为什么它不能正常工作每个序列的 returned 输出都是 0。

int sumOfSeq();
void main()
{
    printf("%d\n", sumOfSeq());
    system("pause");
}
int sumOfSeq()
{
    int n, curr = 1, sum1 = 0, sum2 = 0;
    scanf("%d", &n);
    if (n == -1)
        return sum1 - sum2;
    else
    {
        if (curr % 3 == 0)
        {
            sum1 += n;
            curr++;
        }
        else
        {
            sum2 += n;
            curr++;
        }
        sumOfSeq();
    }
}

I wrote this code and don't understand why it doesn't work properly the output that is returned for every sequence is 0.

是returns0因为变量currsum1sum2在每个变量的开头都是用0初始化的方法的递归调用 sumOfSeq:

 int n, curr = 1, sum1 = 0, sum2 = 0;

相反,您需要在每次递归调用时传递这些变量的最新值,如下所示:

int sumOfSeq(int curr, int sum1, int sum2);
void main()
{
    printf("%d\n", sumOfSeq(1, 0, 0));
    system("pause");
}
int sumOfSeq(int curr, int sum1, int sum2)
{
    int n;
    scanf("%d", &n);
    if (n == -1)
         return sum1 - sum2;
    else if (curr % 3 == 0)
         return sumOfSeq(curr + 1, sum1 + n, sum2);
    else
         return sumOfSeq(curr + 1, sum1, sum2 + n);
}

这样,当达到递归停止条件,即

if (n == -1)
   return sum1 - sum2;

变量 sum1sum2 将是在所有这些递归调用上添加 'n' 的结果。

可以用三元运算符缩短函数

int sumOfSeq(int curr, int sum1, int sum2)
{
    int n;
    scanf("%d", &n);
    if (n == -1)
        return sum2 - sum1;

    return (curr % 3 == 0) ? sumOfSeq(curr + 1, sum1 + n, sum2) : 
                             sumOfSeq(curr + 1, sum1, sum2 + n);
}

在函数 sumOfSeq 中,您没有使用函数的下一次递归调用获得的总和。你只是在函数内调用

sumOfSeq();

所以函数没有意义。

而且不需要分别计算两个总和,因为在任何情况下函数都必须 return 一个值,即结果总和。

函数可以按照下面的演示程序所示的方式定义。

#include <stdio.h>

long long int sumOfSeq( size_t n )
{
    long long int sum = 0;
    
    int item;
    
    if ( scanf( "%d", &item ) == 1 && item != -1 )
    {
        sum += sumOfSeq( n + 1 ) + ( ( n + 1 ) % 3 == 0 ? item : -item );
    }
    
    return sum;
}

int main(void) 
{
    printf( "%lld\n", sumOfSeq( 0 ) );
    
    return 0;
}

输入数字序列的程序输出

9 2 4 7 8 1 3 -1

-24

正如你所见,函数定义非常简单,函数只使用一个参数。

请记住,如果可以在不使用静态局部变量的情况下编写函数,那么使用静态局部变量是个坏主意。否则你会遇到一些困难 运行 第二次使用该功能。

另请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )

而不是

void main()