递归地仅添加偶数

时间:2013-11-07 15:39:33

标签: c recursion

该程序应该从用户获取一系列值,然后只在该范围内添加偶数。我运行了递归函数并准确显示了它需要显示的内容。我只是不确定如何实际添加偶数。有人能帮助我吗?

这是我的recursive_function:

int recursive_function(int first_number, int second_number)
{
int even_range_sum = 0;

printf("\n    Entering sum function for range %d to %d",
    first_number, second_number);
if(first_number <= second_number)
{
    if(is_even(first_number) == 1)
    {
        printf("\n        Adding: %d", first_number);
        recursive_function(first_number + 1, second_number);
    }
    else
    {
        printf("\n        Skipping: %d", first_number);
        recursive_function(first_number + 1, second_number);
    }
}
printf("\n    Exiting sum function for range %d to %d ",
    first_number, second_number);
printf("with result: %d", even_range_sum);
return even_range_sum;
}

现在,一切都是零值。由于变量在每个函数的开头都被重新声明,因此我不对变量做任何事情。有人可以帮我知道我应该在哪里添加。 (我认为我只能有一个回复声明)如果您需要更多信息,请询问。感谢

5 个答案:

答案 0 :(得分:3)

逻辑需要两个变化:

  1. 如果第一个数字是偶数,那么您想将其添加到总和中,否则什么都不做。这就是内部if / else语句中应该发生的事情。目前,您的代码在两个部分都做同样的事情(除了不同的打印输出)。

  2. 无论如何,你应该递归调用你的函数来添加其余的总和。这发生在if / else之外,因为你想要添加范围的其余部分,无论第一个数字是否为偶数。

    而且重要的是,您需要使用返回值。你的函数返回一个(部分)和,所以你需要用它的返回值做一些事情。如果您只是调用它但忽略其返回值,则不会发生任何事情。

  3. 结果:

    if (first_number <= second_number)
    {
        if (is_even(first_number))
        {
            printf("\n        Adding: %d", first_number);
            even_range_sum += first_number;
        }
        else
        {
            printf("\n        Skipping: %d", first_number);
        }
    
        even_range_sum += recursive_function(first_number + 1, second_number);
    }
    

答案 1 :(得分:1)

您忘记了结转每笔前一笔款项的结果。以下版本作为一个完整的程序,包括一个测试。 “is_even”功能缺失了,但您可能已将其列在其他位置;在“is_even”条件下使用模运算符添加很简单。

希望这有帮助。

#include <stdio.h>

int recursive_function(int first_number, int second_number);

int main(int argc, const char * argv[])
{
    recursive_function(1, 10);
    return 0;
}

int recursive_function(int first_number, int second_number)
{
    // Base Case:
    int even_range_sum = 0;

    printf("\n Entering sum function for range %d to %d", first_number, second_number);
    if (first_number <= second_number) {
        if( first_number%2==0 ) {
            printf("\n Adding: %d \n", first_number);
            even_range_sum += first_number;
        } else {
            printf("\n Skipping: %d", first_number);
        }
        even_range_sum += recursive_function(first_number + 1, second_number);
    }
    printf("\n Exiting sum function for range %d to %d \n", first_number, second_number);
    printf("with result: %d \n", even_range_sum);
    return even_range_sum;
}

答案 2 :(得分:0)

您需要在even_range_sum中从递归调用中捕获返回变量,然后在偶数情况下,将该数字添加到。

if(is_even(first_number) == 1)
{
    printf("\n        Adding: %d", first_number);
    even_range_sum = recursive_function(first_number + 1, second_number);
    even_range_sum += first_number;
}
else
{
    printf("\n        Skipping: %d", first_number);
    even_range_sum = recursive_function(first_number + 1, second_number);
}

由于递归调用在两种情况下都是相同的,因此您可以将其从if中分解出来:

even_range_sum = recursive_function(first_number + 1, second_number);
if(is_even(first_number) == 1)
{
    printf("\n        Adding: %d", first_number);   
    even_range_sum += first_number;
}
else
{
    printf("\n        Skipping: %d", first_number);
}

答案 3 :(得分:0)

看起来像家庭作业所以我不会发布完整的解决方案。填写<??>

你被允许做一个辅助功能吗?那么你的辅助函数可以有3个参数。总和,第一个偶数和最后一个数字在范围内(不需要是偶数)。

如果原始函数是奇数,那么原始函数会将1加到起始值,这样它就会转到第一个偶数。因为算术和1后的任何数字都是1,所以你可以这样做:

int even_summer(int range_start, int range_end)
{
  return even_summer_recursion(0, range_start & 1 ? range_start + 1 : range_start, range_end);
}

int even_summer_recursion(int acc, int current_even, int range_end)
{
    if( current_even > range_end )
        return acc; // return the accumulated result
    else // add the current to the acc and increment current to the next even value
        return even_summer_recursion( <??>, <??>, range_end); 
}

如果递归不是一个要求,你可以通过使第一个偶数与for循环中的起始值相同的方式使自己成为迭代版本,并将累加器作为函数中的局部变量。

int even_summer(int range_start, int range_end)
{
  int acc = 0;
  for(int current_even = ( is_even(range_start) ?  range_start : range_start + 1);
      current_even < range_end;
      current_even += <??>) {
    acc += <??>;
  }
  return acc;
}

这里我实际上使用了is_even函数。

答案 4 :(得分:0)

好吧,我是C的初学者,所以我无法纠正你的代码。但我做了一个(有效)。如果它可以帮助您纠正代码,那么您可以通过。希望能帮助到你。

    #include<stdio.h>

    void main()
   {

     int num,num2,temp,sum,num1 ;
     printf("enter range -from:\n ");
     scanf("%d", &num1);
     printf("to:");
     scanf("%d", &num2);
     if(num1>num2)
      {
        temp=num1;
        num1=num2;
        num2=temp;
      }
    sum=sum_eve(num1,num2);
    printf("\n%d", sum);
  }



  int sum_eve(int m,int n)
 {
    int sum;
    if(m%2!=0)
    {
      m=m+1;
    }

    if(n%2!=0)
    {
      n=n-1;
    }

    if(m>n)
    {
     return(0);
    }

    if(n==m)
    {
      return (m);
    }

   else
   {
     sum = n + sum_eve(m,n-2);
     return (sum);
   }
 }