递归/迭代函数

时间:2012-10-14 17:38:18

标签: c++

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

  1. 一个公式
  2. 迭代
  3. 递归
  4. 这是我到目前为止所做的:

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

6 个答案:

答案 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>