使用递归C ++反转数组

时间:2016-12-23 17:38:23

标签: c++ arrays recursion

我的主要想法是从两边缩小它们的阵列。例如,如果输入是1234,则要打印1234然后打印4321(反转)。

#include <iostream>
#include <cmath>
#include <math.h>

using namespace std;

int reversedArray(int* x)
{
    cout<< "*x out of  while =" << *x <<endl ;
    while( *x != 0 )
    {
        cout << "*x=" << *x << endl;
        cout<< "====================== im in reversed   =================" << endl ;
        return reversedArray( x+1  );
    }
    cout<< "after return           "  << *x << endl;
}

int main ()
{
    int Array[] = {10,2,3,4,8 ,0} ;
    int* p_Array = Array;
    reversedArray( Array );
}

在“while”之后,为什么堆栈中的函数不会返回到下一行(“ - &gt; cout&lt;&lt;”返回“&lt;&lt; * x&lt;

4 个答案:

答案 0 :(得分:1)

void printReversed(int * x)
{
    if (*x == 0) return;

    std::cout << *x;
    printReversed(x+1);
    std::cout << *x;
}

答案 1 :(得分:1)

该行:

return reversedArray( x+1  );

退出该功能。因此,如果您进入while,则永远不要重复while或执行while之后的任何代码。这使while有效地成为if语句。

答案 2 :(得分:1)

Crazy Eddie发布的代码完成了这项工作,而Barmar解释了while循环的无效性。我决定发布一种非递归方式来解决上面提到的问题。

#include <iostream>
#include <vector>
using namespace std;


vector<int> reverseArray(vector<int>& arr) {
    vector<int> ans;
    int n = arr.size();

    // insert all elements in the reverse order
    for (size_t i = 0; i < n; i++) {
        ans.push_back(arr[n-i-1]);
    }

    return ans;
}

int main ()
{
    int array[] = {10, 2, 3, 4, 8, 0};
    // convert into vector
    vector<int> arr(array, array+6);
    vector<int> rev = reverseArray(arr);
    // merging the 2 arrays
    arr.insert(arr.end(), rev.begin(), rev.end());
    // printArray(arr) -- implement to fit your needs;
}

答案 3 :(得分:0)

当您将int[]传递给某个函数时,它会衰减到int*,这只是内存中的一个地址。 C ++更好的计划是将copy_backwardostream_iterator

一起使用
copy_backward(Array, Array + sizeof(Array) / sizeof(*Array), ostream_iterator<int>(cout, " "))

请注意,此方法使用数组的实际大小,并且不依赖于终端元素。因此,没有数字是非限制性的,并且由于未能提供终止元素而不可能出现段错误。

如果您可以访问C ++ 11,则可以进一步简化:

copy(crbegin(Array), crend(Array), ostream_iterator<int>(cout, " "))

Live Example