0

该程序运行,但它也喷出一些其他的东西,我不太清楚为什么。第一个输出是正确的,但从那里我不确定会发生什么。这是我的代码:

#include <iostream>
using namespace std;

const int MAX = 10;

int sum(int arrayNum[], int n)
{
    int total = 0;
    if (n <= 0)
        return 0;
    else 
        for(int i = 0; i < MAX; i ++)
        {
            if(arrayNum[i] % 2 != 0)
                total += arrayNum[i];


        }
    cout << "Sum of odd integers in the array: " << total << endl;
    return arrayNum[0] + sum(arrayNum+1,n-1);
}


int main()
{
    int x[MAX] = {13,14,8,7,45,89,22,18,6,10};

    sum(x,MAX);

    system("pause");
    return 0;
}
4

4 回答 4

3

递归一词意味着(在最简单的变体中)通过将问题简化为同一问题的更简单版本来解决问题,直到变得微不足道。在你的例子中......

n为了计算元素数组中奇数值的数量,我们有以下情况:

  1. 数组为空:结果通常为 0
  2. 第一个元素是偶数:结果将是数组其余部分的奇数元素之和
  3. 第一个元素是奇数:结果将是这个元素添加到数组其余部分的奇数元素之和

在这个问题中,简单的情况是计算一个空数组的结果,而更简单的问题是在一个较小的数组上工作。重要的是要理解,更简单的版本必须“更接近”一个简单的情况才能使递归起作用。

一旦算法清晰,代码转换很简单:

// Returns the sums of all odd numbers in
// the sequence of n elements pointed by p
int oddSum(int *p, int n) {
    if (n == 0) {
        // case 1
        return 0;
    } else if (p[0] % 2 == 0) {
        // case 2
        return oddSum(p + 1, n - 1);
    } else {
        // case 3
        return p[0] + oddSum(p + 1, n - 1);
    }
}

递归是一个强大的工具,你应该尝试理解这个例子,直到它 100% 清楚它是如何工作的。尝试从头开始重写它(我并不是说你应该记住它,只是在你阅读并认为你理解了解决方案后尝试重写它),然后尝试解决这个问题的微小变化。

再多的阅读也无法弥补编写代码。

于 2013-05-21T06:17:30.607 回答
0

如果您使用循环,则不是递归。

分离计算和输出通常也是一个好主意。

int sum(int arrayNum[], int n)
{
    if (n <= 0)    // Base case: the sum of an empty array is 0.
        return 0;
    // Recursive case: If the first number is odd, add it to the sum of the rest of the array.
    //                 Otherwise just return the sum of the rest of the array.
    if(arrayNum[0] % 2 != 0)
         return arrayNum[0] + sum(arrayNum + 1, n - 1);
    else
         return sum(arrayNum + 1, n - 1);
}

int main()
{
    int x[MAX] = {13,14,8,7,45,89,22,18,6,10};
    cout << sum(x,MAX);
}
于 2013-05-21T05:51:48.783 回答
0

您将更新传递n给递归函数作为参数,但没有在内部使用它。

在此声明中更改MAXn

for(int i = 0; i < n; i ++)
于 2013-05-21T05:00:42.383 回答
0

所以这并不能真正回答你的问题,但它应该有所帮助。

因此,您的代码并不是真正的递归。如果我们运行你的函数

int total = 0; //Start a tally, good.
if (n <= 0)
    return 0;  //Check that we are not violating the array, good.

else 
    for(int i = 0; i < MAX; i ++)
    {
        if(arrayNum[i] % 2 != 0) //THIS PART IS WIERD
        total += arrayNum[i];
    }

它奇怪的原因是因为你正在那里解决问题。该 for 循环将遍历列表并将所有奇数加起来。

您通过递归所做的可能是这样做:

奇数的和是多少:

13,14,8,7,45,89,22,18,6,10
+
14,8,7,45,89,22,18,6
+
8,7,45,89,22,18
+
7,45,89,22 ... etc

如果是这样,那么您只需要更改:

for(int i = 0; i < MAX; i ++)

for(int i = 0; i < n; i ++)

但否则你真的需要重新考虑你解决这个问题的方法。

于 2013-05-21T05:04:34.400 回答