C++:数组的递归函数
C++: recursive function for array
我正在尝试以相反的顺序编写数组元素,但遇到了这个示例
template <class T>
void reverse(T arr[], int size)
{
if (size>=2)
{
swap(arr[0],arr[size-1]);
reverse(arr+1,size-2);
}
}
我不明白第二行 - 为什么他们将数组的大小减去 2?
如果我在 "swap" 函数中有 10 个元素,通过将它减去 1 以将第一个元素与最后一个元素交换,然后再将它减去 2 将得到 8,但将那个大小再次放入 "swap" 函数中我会得到7!不应该是 8 而不是 7 吗?
该函数的工作原理是交换数组的第一个和最后一个元素,然后递归地对 sub-array 从 [1]
到 [size-2]
执行相同的操作,就像这样(示例假定一个包含 7 个元素的数组):
|0 1 2 3 4 5 6| <-- the array as supplied to the function
6|1 2 3 4 5|0 <-- swap [0] with [6], call recursively for 1..5
6 5|2 3 4|1 0 <-- swap [1] with [5], call recursively for 2..4
6 5 4|3|2 1 0 <-- swap [2] with [4], call recursively for 3..3
6 5 4 3 2 1 0 <-- do nothing because the size is less than 2
大小在每一步减少 2,因为 2 个元素被交换并且现在处于所需的顺序。
我觉得这段代码是对的。
让我们看看 4 元素数组做了什么:[0,1,2,3]
第一次调用,arr = [0,1,2,3] 且size = 4。size大于2,所以交换第一个和最后一个元素。 arr = [3,1,2,0]。现在是 arr = [1,2,3] 和 size = 2 的反向调用。
将要做什么? swap(arr[0] =1, arr[size-1 =2-1=1] =2]。
新数组是 [3,2,1,0]。
第二行排除数组的最后一个元素,这已经完成了。
我正在尝试以相反的顺序编写数组元素,但遇到了这个示例
template <class T>
void reverse(T arr[], int size)
{
if (size>=2)
{
swap(arr[0],arr[size-1]);
reverse(arr+1,size-2);
}
}
我不明白第二行 - 为什么他们将数组的大小减去 2? 如果我在 "swap" 函数中有 10 个元素,通过将它减去 1 以将第一个元素与最后一个元素交换,然后再将它减去 2 将得到 8,但将那个大小再次放入 "swap" 函数中我会得到7!不应该是 8 而不是 7 吗?
该函数的工作原理是交换数组的第一个和最后一个元素,然后递归地对 sub-array 从 [1]
到 [size-2]
执行相同的操作,就像这样(示例假定一个包含 7 个元素的数组):
|0 1 2 3 4 5 6| <-- the array as supplied to the function
6|1 2 3 4 5|0 <-- swap [0] with [6], call recursively for 1..5
6 5|2 3 4|1 0 <-- swap [1] with [5], call recursively for 2..4
6 5 4|3|2 1 0 <-- swap [2] with [4], call recursively for 3..3
6 5 4 3 2 1 0 <-- do nothing because the size is less than 2
大小在每一步减少 2,因为 2 个元素被交换并且现在处于所需的顺序。
我觉得这段代码是对的。 让我们看看 4 元素数组做了什么:[0,1,2,3]
第一次调用,arr = [0,1,2,3] 且size = 4。size大于2,所以交换第一个和最后一个元素。 arr = [3,1,2,0]。现在是 arr = [1,2,3] 和 size = 2 的反向调用。 将要做什么? swap(arr[0] =1, arr[size-1 =2-1=1] =2]。 新数组是 [3,2,1,0]。 第二行排除数组的最后一个元素,这已经完成了。