2016-11-25 93 views
0

我做了什麼僞代碼告訴我在書中介紹的算法和內部排序沒有工作遞歸和C++

有兩個部分,我真的不明白

1,怎麼辦你做一個遞歸函數,這是一個無效的,我的意思是不應該遞歸函數總是返回最後一步,然後在它之前..這是一個無效,所以它會如何預處理任務012-merg_sor()被調用兩次一個功能..做u調用嵌套的遞歸?還是什麼? ..它是如何影響MERG功能

#include <iostream> 
#include <vector> 

using namespace std; 
void Merg(vector<int> Arr,int start,int middle,int end) 
{ 
    std::vector<int> left; 
    std::vector<int> right; 
    for(int i =start;i<(end-start);i++) 
    { 
     if (i <middle) 
     { 
      right.push_back(Arr.at(i)); 
     } 
     else 
     { 
      left.push_back(Arr.at(i)); 
     } 
    } 
    int j=0; 
    int k=0; 
    for(int i =start;i<(end-start);i++) 
    { 
     if(right.at(j)<=Arr.at(i)) 
     { 
      Arr.at(i)=right.at(j); 
      j++; 
     } 
     else 
     { 
      Arr.at(i)=left.at(k); 
      k++; 
     } 
    } 
} 
void Merg_sort(vector<int> Arr,int start,int end) 
{ 
    if (start <end) 
    { 
     int middle = (start+end)/2; 
     Merg_sort(Arr,start,middle); 
     Merg_sort(Arr,middle+1,end); 
     Merg(Arr,start,middle,end); 
    } 
} 

int main() 
{ 
vector<int> x; 
for (int i =0;i<8;i++){x.push_back(i);} 
x.at(2)=8; 
Merg_sort(x,0,7); 
} 
+0

即,直接或間接地調用自身的功能是一個遞歸函數的定義。何時,何地以及如何多次自稱是無關緊要的。 –

+0

1)的變化就地完成。也就是說,'Arr'參數正在被修改。 2)這只是遞歸。 3)'if(start

+4

您應該通過引用'vector &Arr'傳遞向量,使結果在main中可見。 –

回答

0

1,您是如何使一個遞歸函數是一個void我的意思是不應該的遞歸函數總是返回最後一個步驟又是什麼才..這是一個無效,所以它會如何執行任務

函數可能有副作用。這意味着,一個函數可以修改程序的狀態。 void函數總是以副作用起作用。不具有副作用void函數是完全無用的。函數是否遞歸對這個問題沒有影響。

2-merg_sor()在一個函數中被調用了兩次..你是否調用嵌套的遞歸?或者什麼?

我不知道這是否是常用的名詞,但我將之形容爲多分枝遞歸

2 ..和它是如何影響MERG功能

沒有,因爲它沒有副作用。

我做了什麼僞代碼告訴我

也許你沒有正確理解的僞代碼。或許論據是隱含引用在僞語言,因爲它們是在像Python語言,你正在閱讀這樣的。

+0

2)被調用兩次不會產生4個數組,它們是從最後一步中分割出來的,這會產生4個數字,對嗎?..如果是這樣,我們只有一個用於合併2個數組的merg命令,而不是4個他們但2 ..它是如何執行的? –