2

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

这是我的递归函数:

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

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

4

5 回答 5

3

逻辑需要两处改变:

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

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

    重要的是,您需要使用返回值。您的函数返回一个(部分)总和,因此您需要对其返回值做一些事情。如果你只是调用它但忽略它的返回值,那么什么都没有发生。

结果:

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);
}
于 2013-11-07T15:43:56.477 回答
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;
}
于 2013-11-07T16:27:38.367 回答
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);
   }
 }
于 2013-11-07T18:22:05.360 回答
0

您需要从递归调用中捕获返回变量 in 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);
}
于 2013-11-07T15:45:22.253 回答
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的功能。

于 2013-11-07T16:20:10.193 回答