该程序应该从用户获取一系列值,然后只在该范围内添加偶数。我运行了递归函数并准确显示了它需要显示的内容。我只是不确定如何实际添加偶数。有人能帮助我吗?
这是我的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;
}
现在,一切都是零值。由于变量在每个函数的开头都被重新声明,因此我不对变量做任何事情。有人可以帮我知道我应该在哪里添加。 (我认为我只能有一个回复声明)如果您需要更多信息,请询问。感谢
答案 0 :(得分:3)
逻辑需要两个变化:
如果第一个数字是偶数,那么您想将其添加到总和中,否则什么都不做。这就是内部if / else语句中应该发生的事情。目前,您的代码在两个部分都做同样的事情(除了不同的打印输出)。
无论如何,你应该递归调用你的函数来添加其余的总和。这发生在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);
}
答案 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);
}
}