1

我正在尝试编写一个具有三个参数的递归函数;一个数组和两个数组索引。该函数应反转两个索引之间的值的顺序。我想了解正在发生的事情,而不是仅仅被告知答案。

到目前为止,这是我的代码:

#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
4

5 回答 5

3

当 b1==b2 时,您不会返回任何内容,因此会发出警告。由于这是您的基本情况,因此您似乎想要这样做。但是,由于您实际上没有在任何地方使用返回的内容,也许 switchAroo 不应该返回任何内容?

于 2013-11-13T15:43:16.247 回答
3

你的终止条件是错误的。在第一次调用时b1is2b2is 5,第二次调用时分别是3and 4,然后是4and 3,依此类推。条件应该是例如

if (b1 >= b2)

您可能希望更改参数声明以unsigned int防止使用负整数文字调用函数。

此外,由于您通过2and 5asb1b2第一次调用,实际上您正在交换数组中第三个和第六个元素的位置,这意味着字符串终止被移动,因此您现在有一个两个字符的字符串。

在处理递归函数时,实际上最好先在纸上尝试设计它们,包括一些带有少量输入的示例调用。

于 2013-11-13T15:46:30.323 回答
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);
    }
}

顺便说一句,该功能被窃听,想想会发生什么switchAroo(a, 0, 1);

于 2013-11-13T15:43:05.640 回答
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);
}
于 2013-11-13T15:53:13.850 回答
1

首先,让我们澄清警告。switchAroo 函数必须返回一个字符。您仅在 else 分支中返回。因此,如果条件为真(即 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 对。如果这对无效,则您已到达间隔的中间,这意味着您交换了所需的所有内容。最后一次调用的停止条件为真,因此递归在此处停止。

我希望我说得够清楚,你明白它是如何工作的。您在代码中遇到的错误已在以前的答案中修复。

于 2013-11-13T15:58:16.960 回答