C++递归函数,可反转数组索引在两个边界之间的顺序
C++ recursive function that reverses the order of an array's indexes between two bounds
我正在尝试编写一个具有三个参数的递归函数;一个数组和两个数组索引。该函数应反转两个索引之间值的顺序。我想了解正在发生的事情,而不仅仅是被告知答案。
这是我到目前为止的代码:
#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
您的终止条件是错误的。在第一个调用中,b1
是2
,b2
是5
,第二个调用分别是3
和4
,然后是4
和3
,依此类推。条件应例如
if (b1 >= b2)
您可能希望将参数声明更改为 unsigned int
,以防止使用负整数文本调用函数。
此外,由于您将2
和5
作为第一次调用的b1
和b2
传递,因此您实际上是在切换数组中第三个和第六个元素的位置,这意味着字符串终止被移动,因此您现在有一个两个字符的字符串。
在处理递归函数时,实际上最好先尝试在纸上设计它们,包括一些带有一小组输入的示例调用。
当 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,因此递归在此处停止。
我希望我足够清楚,并且您了解它是如何工作的。您在代码中遇到的错误已在以前的答案中修复。
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- 如何在ROS中很好地订阅两个主题(图像和边界框分开发布)
- C++递归函数,可反转数组索引在两个边界之间的顺序
- 在有限边界下有效地合并两个列表
- 如何得到两个结合的vtkPolyData曲面的边界