该程序运行但它也会喷出其他一些东西,我不太清楚为什么。第一个输出是正确的,但从那里我不确定会发生什么。这是我的代码:
#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;
}
答案 0 :(得分:3)
术语递归意味着(在最简单的变体中)通过将问题简化为相同问题的更简单版本来解决问题,直到变得微不足道。在你的例子中......
要计算n
元素数组中奇数值的数量,我们有这些情况:
在这个问题中,琐碎的情况是计算空数组的结果,问题的简单版本正在处理较小的数组。重要的是要理解更简单的版本必须“更接近”递归工作的简单案例。
一旦算法清晰,转换为代码很简单:
// 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);
}