我正在尝试编写一个有三个参数的递归函数;一个数组和两个数组索引。该函数应该反转两个索引之间的值的顺序。我想了解发生了什么,而不仅仅是被告知答案。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
char switchAroo(char a[], int b1, int b2);
int main()
{
char a[6] {'A', 'B', 'C', 'D', 'E', '\0'};
cout << a;
switchAroo(a, 2, 5);
return 0;
}
char switchAroo(char a [], int b1, int b2)
{
char temp;
if (b1 == b2)
cout << "The array after switchAroo is " << a << endl;
else
{
temp = a[b1];
a[b1] = a[b2];
a[b2] = temp;
b1++;
b2--;
return switchAroo(a, b1, b2);
}
}
我收到以下警告代码:
warning C4715: 'switchAroo' : not all control paths return a value
答案 0 :(得分:3)
当b1 == b2时,你不返回任何东西,因此警告。既然这是你的基础案例,那么你似乎也想要。但是,由于你实际上没有使用返回的内容,也许switchAroo不应该返回任何东西?
答案 1 :(得分:3)
您的终止条件有误。在第一个电话中,b1
为2
,b2
为5
,第二个电话分别为3
和4
,然后4
}和3
,依此类推。条件应该是例如。
if (b1 >= b2)
您可能希望将参数声明更改为unsigned int
,以防止使用负整数文字调用该函数。
此外,由于您在第一次调用时将2
和5
作为b1
和b2
传递,实际上您正在切换数组中第三个和第六个元素的位置,意味着字符串终止被移动,所以你现在有一个双字符串。
在处理递归函数时,首先尝试在纸上设计它们可能是个好主意,包括一些带有一小组输入的示例调用。
答案 2 :(得分:2)
您认为从这个功能回来的是什么?只是抛弃返回值
void switchAroo(char a [], int b1, int b2)
{
char temp;
if (b1 == b2)
cout << "The array after switchAroo is " << a << endl;
else
{
temp = a[b1];
a[b1] = a[b2];
a[b2] = temp;
b1++;
b2--;
switchAroo(a, b1, b2);
}
}
BTW函数被窃听,想想switchAroo(a, 0, 1);
答案 3 :(得分:1)
您正在通过输入5来切换空终止符。此外,不需要为switchAroo返回值。
#include <iostream>
using namespace std;
void switchAroo(char a[], int b1, int b2);
int main()
{
char a[6] = {'A', 'B', 'C', 'D', 'E', '\0'};
cout << a << endl;
switchAroo(a, 2, 4);
cout << a << endl;
cin.get();
return 0;
}
void switchAroo(char a [], int b1, int b2)
{
if (b1 >= b2)
return;
swap(a[b1], a[b2]);
switchAroo(a, b1 + 1, b2 - 1);
}
答案 4 :(得分:1)
首先,让我们澄清警告。 switchAroo函数必须返回一个char。你只返回其他分支。因此,如果条件为真(即b1 == b2),则不返回任何内容。此外,您无需在此功能中返回任何内容。
谈到'发生了什么',你需要交换数组a的索引i和索引j之间的所有元素。假设您有一个交换2个变量的函数。您需要为每对索引x,y调用该函数,其中i <= x
递归方法类似。首先,您有一个停止条件(正确的停止条件是b1> = b2,如前面的答案所述)。如果不满足该条件,您仍然至少要交换一对元素(包括b1,b2对)。所以,你交换b1 b2,找到另一对。如果存在有效对,则对b1 + 1,b2-1也有效(从间隔的“外部”开始到“内部”,因此剩余的对更接近间隔的中间)。您调用switchAroo来交换b1 + 1,b2-1对。如果这一对无效,则达到间隔的中间位置,这意味着您交换了所需的一切。最后一次调用的停止条件为true,因此递归在此处停止。
我希望我足够清楚,你明白它是如何运作的。您在代码中遇到的错误在以前的答案中得到修复。