采用奇数整数之和的递归函数

时间:2013-05-21 04:52:08

标签: c++ arrays recursion

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

#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 个答案:

答案 0 :(得分:3)

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

要计算n元素数组中奇数值的数量,我们有这些情况:

  1. 数组为空:结果为0
  2. 第一个元素是偶数:结果将是数组其余部分奇数元素的总和
  3. 第一个元素是奇数:结果将此元素添加到数组其余部分的奇数元素之和
  4. 在这个问题中,琐碎的情况是计算空数组的结果,问题的简单版本正在处理较小的数组。重要的是要理解更简单的版本必须“更接近”递归工作的简单案例。

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

    // 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%清楚它是如何工作的。尝试从头开始重写它(我不是说你应该记住它,只是在你阅读后尝试重写它,你认为你理解了解决方案)然后尝试解决这个问题的小变化。

    没有多少读数可以补偿编写代码。

答案 1 :(得分:0)

您将更新的n传递给递归函数作为参数但未在其中使用。

在此声明中将MAX更改为n

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

答案 2 :(得分: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 ++)

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

答案 3 :(得分: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);
}