我试图以相反的顺序编写数组元素,我遇到了这个例子
template <class T>
void reverse(T arr[], int size)
{
if (size>=2)
{
swap(arr[0],arr[size-1]);
reverse(arr+1,size-2);
}
}
我没有得到第二行 - 为什么他们将数组的大小减去2? 如果我在&#34; swap&#34;中有10个元素函数通过减去1来将第一个元素与最后一个元素交换然后再将它减去2将得到8但是将该大小再次放入&#34;交换&#34;功能我会得到7 !!不应该是8而不是7?
答案 0 :(得分:2)
该函数通过交换数组的第一个和最后一个元素,然后递归地为子数组从[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个元素,现在按所需顺序排列。
答案 1 :(得分:0)
我认为这段代码是对的。 让我们看一下4元素阵列的作用:[0,1,2,3]
第一次调用,arr = [0,1,2,3]和size = 4.大小超过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]。 第二行排除了已经完成的数组的最后一个元素。