递归函数减去
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
并且输出应该是 -24
(i.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
因为变量curr
、sum1
、sum2
在每个变量的开头都是用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;
变量 sum1
和 sum2
将是在所有这些递归调用上添加 '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()
此函数获取数字序列,直到用户输入 -1
。它应该 return index(mod3)=0
处的数字总和减去其他索引中的数字。
例如:
9 2 4 7 8 1 3 -1
该函数首先对索引处可被三整除的所有数字求和。所以 sum1
应该是 5
因为 4 在第 3 个索引处,1 在第 6 个索引处,所有其他索引总和为 sum2
。然后它应该从另一个中减去一个:sum1 - sum2
并且输出应该是 -24
(i.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
因为变量curr
、sum1
、sum2
在每个变量的开头都是用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;
变量 sum1
和 sum2
将是在所有这些递归调用上添加 '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()