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

C++ recursive function that reverses the order of an array's indexes between two bounds

本文关键字:两个 边界 之间 顺序 递归函数 可反转 数组 索引 C++      更新时间:2023-10-16

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

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

#include <iostream>
using namespace std;
char switchAroo(char a[], int b1, int b2);
int main()
{
    char a[6] {'A', 'B', 'C', 'D', 'E', ''};
    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

您的终止条件是错误的。在第一个调用中,b12b25,第二个调用分别是34,然后是43,依此类推。条件应例如

if (b1 >= b2)

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

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

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

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

你认为你从这个函数中返回了什么?只需放弃返回值

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);会发生什么

通过输入 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', ''};
    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);
}

首先,让我们澄清一下警告。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 对。如果此货币对无效,则您到达了间隔的中间,这意味着您交换了所需的所有内容。最后一个调用的停止条件为 true,因此递归在此处停止。

我希望我足够清楚,并且您了解它是如何工作的。您在代码中遇到的错误已在以前的答案中修复。