我在创建函数时遇到了一些困难,使用迭代和递归来查找1和用户输入的数字之间的所有偶数和的总和。程序指南需要一个函数来解决这三种方式:
这是我到目前为止所做的:
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
void formulaEvenSum(int num, int& evenSum)
{
evenSum = num / 2 * (num / 2 + 1);
return;
}
void loopEvenSum(int num, int& evenSum2)
{
}
int main()
{
int num, evenSum, evenSum2;
cout << "Program to compute sum of even integers from 1 to num.";
cout << endl << endl;
cout << "Enter a positive integer (or 0 to exit): ";
cin >> num;
formulaEvenSum(num, evenSum);
loopEvenSum(num, evenSum2);
cout << "Formula result = " << evenSum << endl;
cout << "Iterative result = " << evenSum2 << endl;
system("PAUSE");
return 0;
}
答案 0 :(得分:3)
使用迭代查找偶数之和如下所示。
void loopEvenSum(int num, int &evenSum2)
{
evenSum2=0;
for (i=2;i<=num;i++)
{
if(i%2==0)
evenSum2+=i;
}
}
以下代码虽然不是最有效的,但可以让您了解如何编写递归函数。
void recursiveEvenSum(int num,int &evenSum3,int counter)
{
if(counter==1)
evenSum3=0;
if(counter>num)
return;
if(counter%2==0)
evenSum3+=counter;
recursiveEvenSum(num,evenSum3,counter+1);
}
现在你可以将recursiveEvenSum(...)称为
int evenSum3;
recursiveEvenSum(num,evenSum3,1);
答案 1 :(得分:0)
您应该能够使用for
循环构建迭代解决方案而不会出现太多问题。
递归解决方案可能采用以下形式:
f(a)
if(a>0)
return a+f(a-1)
else
return 0
f(user_input)
你必须区分你“深入”的情况和你提供不影响总数的答案的情况,但是开始爬出递归(尽管还有其他方法可以结束它)。
另一种解决方案是表格:
f(a,sum,total)
if(a<=total)
return f(a+1,sum+a,total)
else
return sum
f(0,0,user_input)
第二种方法的优点是某些语言能够识别和优化所谓的“tail recursion”。您将在第一个递归形式中看到,为每个递归级别存储中间结果是必要的,但在第二种形式中这不是必需的,因为返回最终答案所需的所有信息都是每次传递的。
希望这有帮助!
答案 2 :(得分:0)
我认为这样做不要忘记在调用函数之前将evenSum1,evenSum2和evenSum3的值初始化为
void loopEvenSum(int num, int& evenSum2)
{
for(int i = num; i > 1; i--)
if(i%2 == 0)
evenSum2+=i;
}
void RecursiveEvenSum(int num, int & evenSum3)
{
if(num == 2)
{
evenSum3 + num;
return;
}
else
{
if(num%2 == 0)
evenSum3+=num;
num--;
RecursiveEvenSum(num, evenSum3);
}
}
答案 3 :(得分:0)
void loopEvenSum(int num, int& evenSum2)
{
eventSum2 = 0;
for(int i = 1 ; i <= num; i++){
(i%2 == 0) eventSum += i;
}
}
void recurEvenSum(int num, int& evenSum3)
{
if(num == 1) return;
else if(num % 2 == 0) {
eventSum3 += num;
recurEvenSum(num-1, eventSum3);
}
else recurEvenSum(num-1, eventSum3);
}
顺便说一句,在调用方法之前,您必须先将evenSum
初始化为0
。
答案 4 :(得分:0)
如果返回int而不是void
,递归方法会简单得多void iterEvenSum(int num, int& evenSum2)
{
evenSum2 = 0;
if (num < 2) return;
for (int i = 0; i <= num; i+=2)
evenSum2 += i;
}
int recurEvenSum(int num)
{
if (num < 0) return 0;
if (num < 4) return 2;
return num - num%2 + recurEvenSum(num-2);
}
答案 5 :(得分:0)
要使用迭代方法得到集合[1,num]中可被2整除的所有数字的总和,您可以遍历该范围内的所有数字,从num开始直到达到2,并添加数字当前迭代到总和,如果这可以被2整除。
请注意,在开始循环之前必须为evenSum2指定零,否则结果将与 formulaEvenSum()的结果不同。
void loopEvenSum(int num, int& evenSum2)
{
assert(num > 0);
evenSum2 = 0;
for (int i=num; i>=2; --i) {
if (0 == (i % 2)) {
evenSum2 += i;
}
}
}
要通过使用递归方法获得相同的结果,而不是通过引用传递将保存总和的变量,我建议您在每次调用时返回总和;否则你需要保持当前递归的计数器,或者更糟糕的是,你需要在开始递归之前在调用者中将总和设置为零。
int recursiveEventSum(int num)
{
assert(num > 0);
if (num == 1) {
return 0;
} else {
return ((num % 2) ? 0 : num) + recursiveEventSum(num-1);
}
}
请注意,由于只有在从偶数中减去两个(而不是一个)时才得到偶数,所以你可以通过仅对这些数字进行迭代来进行优化,最后,如果num是奇数,则进行第一次迭代。< / p>