【问题标题】:Recursive function to subtract递减函数
【发布时间】:2021-04-02 09:12:26
【问题描述】:

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

例如:

9 2 4 7 8 1 3 -1 

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

我写了这段代码,但我不明白为什么它不能正常工作,每个序列返回的输出都是 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();
    }
}

【问题讨论】:

    标签: c recursion computer-science function-definition


    【解决方案1】:

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

    它返回0,因为变量currsum1sum2在方法sumOfSeq的每次递归调用开始时被初始化为0

     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);
    }
    

    【讨论】:

      【解决方案2】:

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

      sumOfSeq();
      

      所以这个函数没有意义。

      并且没有必要分别计算两个和,因为在任何情况下函数都必须返回一个值,即结果和。

      该函数可以通过以下方式定义,如下面的演示程序所示。

      #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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        相关资源
        最近更新 更多