簡體   English   中英

通過在 C++ 中遞歸拆分數組來反轉數組

[英]Reversing an array by recursively splitting the array in C++

string recursion(int arr[], int arrSize) {

if(arrSize == 1){
    return to_string(arr[0]);
}
string letterLeft, letterRight, letterFull;

//logic1: Normal Recursion
//letterFull = to_string(a[n-1]) + " " + recursion(a, n-1);

//logic2: D&C ------------------------------------------------------ <
letterLeft += recursion(arr, arrSize/2);
letterRight += recursion(arr + arrSize/2, arrSize-arrSize/2) + " ";
letterFull += letterRight + letterLeft;

return letterFull;
}

我最近使用 'logic2: D&C' 遞歸地拆分數組以反轉它們(更像是分而治之)。

(即如果 2,5,4,1 作為輸入,輸出應該是 1,4,5,2)。

它通過了所有測試用例,就像我剛剛給出的示例一樣。 然而,我覺得我並不真正了解遞歸的流程。 如果可能的話,我在這里尋求某人的幫助,以逐步解釋“logic2:D&C”中發生的事情,並提供示例流程圖和值?

PS:

我從https://stackoverflow.com/a/40853237/18762063獲得幫助來實現這個“logic2:D&C”。 編輯 - 對參數列表進行了少許更改。

尚不清楚為什么使用std::string類型的對象。 要反轉char類型的對象數組,無需使用sdt::string類。 這只是效率低下。 該功能可以如下所示

void recursion( char arr[], size_t arrSize )
{
    if ( not ( arrSize < 2 ) )
    {
        std::swap( arr[0], arr[arrSize-1] );
        recursion( arr + 1, arrSize - 2 );
    }
}

分而治之算法的重點是在處理數據時將數據分解成越來越小的部分。

例如,如果要反轉數組,則應該發生以下情況:

  1. 數據被分成兩等份,這些部分的順序被交換(所以后半部分變成前半部分,前半部分變成后半部分)
  2. 然后將 2 個拆分部分也分解為 2-2 個相等的部分,並反轉。
  3. 依此類推,直到拆分為 1 長度,因此它們不能再拆分,從而導致完全反轉的數組。

閱讀有關 D 和 C 算法的材料

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM