C ++递归函数,用于反转两个边界之间数组索引的顺序

时间:2013-11-13 15:40:12

标签: c++ arrays recursion

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

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

#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

5 个答案:

答案 0 :(得分:3)

当b1 == b2时,你不返回任何东西,因此警告。既然这是你的基础案例,那么你似乎也想要。但是,由于你实际上没有使用返回的内容,也许switchAroo不应该返回任何东西?

答案 1 :(得分:3)

您的终止条件有误。在第一个电话中,b12b25,第二个电话分别为34,然后4 }和3,依此类推。条件应该是例如。

if (b1 >= b2)

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

此外,由于您在第一次调用时将25作为b1b2传递,实际上您正在切换数组中第三个和第六个元素的位置,意味着字符串终止被移动,所以你现在有一个双字符串。

在处理递归函数时,首先尝试在纸上设计它们可能是个好主意,包括一些带有一小组输入的示例调用。

答案 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,因此递归在此处停止。

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