【问题标题】:C++: recursive function for arrayC++:数组的递归函数
【发布时间】:2017-01-15 14:43:03
【问题描述】:

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

template <class T>
void reverse(T arr[], int size)
{
    if (size>=2)
    {
        swap(arr[0],arr[size-1]);
        reverse(arr+1,size-2);
    }       
} 

我没有得到第二行 - 为什么他们将数组的大小减去 2? 如果我在“交换”函数中有 10 个元素,通过将第一个元素与最后一个元素相减来将第一个元素与最后一个元素进行交换,然后再将其减去 2 将得到 8,但将该大小再次放入“交换”函数中,我会得到 7 !!不应该是 8 而不是 7?

【问题讨论】:

  • 你从哪里得到 7?如果size 是10,size - 2 是8。size - 1 不会修改size

标签: c++ arrays recursion reverse


【解决方案1】:

该函数通过交换数组的第一个和最后一个元素来工作,然后递归地对从[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 个元素并且现在处于所需的顺序。

【讨论】:

    【解决方案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 的反向调用。 将要做什么?交换(arr[0] =1,arr[size-1 =2-1=1] =2]。 新数组是 [3,2,1,0]。 第二行排除了数组的最后一个元素,这已经完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多