2

我很难创建一个函数,使用迭代和递归来找到 1 和用户输入的数字之间的所有偶数的总和。程序指南需要一个函数来解决这三种方式:

  1. 一个公式
  2. 迭代
  3. 递归

这是我到目前为止所拥有的:

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

}
4

6 回答 6

3

Using iteration to find the sum of even number is as given below.

void loopEvenSum(int num, int &evenSum2)
{
    evenSum2=0;
    for (i=2;i<=num;i++)
    {
        if(i%2==0)
            evenSum2+=i;
    }
}

The following code though not the most efficient can give you an idea how to write a recursive function.

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

Now you can call recursiveEvenSum(...) as

int evenSum3;
recursiveEvenSum(num,evenSum3,1);
于 2012-10-14T18:04:10.867 回答
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);
}
于 2012-10-14T17:55:38.183 回答
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)

第二种方法的优点是某些语言能够识别和优化所谓的“尾递归”。您将在第一种递归形式中看到,有必要为每个递归级别存储一个中间结果,但在第二种形式中这不是必需的,因为每次都会传递返回最终答案所需的所有信息。

希望这可以帮助!

于 2012-10-14T17:47:46.797 回答
0

我想这样就行了别忘了在调用函数之前把evenSum1、evenSum2和evenSum3的值初始化为0

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);
    }
}
于 2012-10-14T17:51:16.907 回答
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在调用方法之前进行初始化。

于 2012-10-14T17:53:00.870 回答
0

要使用迭代方法获得集合 [1,num] 中所有可被 2 整除的数字的总和,您可以遍历该范围内的所有数字,从 num 开始直到达到 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 为奇数,则最终加上第一次迭代。

于 2016-01-25T08:48:27.840 回答