C ++:数组的递归函数

时间:2017-01-15 14:43:03

标签: c++ arrays recursion reverse

我试图以相反的顺序编写数组元素,我遇到了这个例子

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?

2 个答案:

答案 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]。 第二行排除了已经完成的数组的最后一个元素。