考慮以下C++代碼用於一個簡單的二進制樹DFS遍歷:不同遞歸輸出
#include <iostream>
#include <vector>
using namespace std;
int print_vector(vector<char> *vec){
for (auto &it: *vec)
cout<<it;
cout<<'\n';
return 0;
}
int btree_dfs_traversal(int max_depth, int cur_depth, vector<char> position){
if (cur_depth>max_depth)
return 0;
print_vector(&position);
vector<char>left = position;
vector<char>right = position;
left.push_back('l');
right.push_back('r');
return btree_dfs_traversal(max_depth, cur_depth+1, left)+btree_dfs_traversal(max_depth, cur_depth+1, right);
}
int main(int argc, const char * argv[]) {
vector<char> pos;
btree_dfs_traversal(4, 0, pos);
return 0;
}
的功能(一個最小的例子)訪問一個二叉樹,並打印各節點的「位置」它訪問。與標準DFS的唯一區別是(這部分有所不同),大多數實現使用迭代訪問這兩個節點,而我的return
語句返回兩個訪問的和。
我希望該計劃從左邊聲明遞歸,即輸出開頭l
,ll
,lll
,......的確在我的系統(OSX)就是這個樣子,和ideone有這種輸出了。
但是,在一些朋友的系統中,輸出是不同的。遞歸從右邊的聲明開始,即r
,rr
......不幸的是,我目前沒有他們編譯器信息的確切信息。
我的問題是:總和的兩個遞歸是一個未定義的行爲,使不同的編譯器可以產生不同的結果?或者,從正確的開始是錯誤的?
未指定首先計算算術表達式的兩邊中的哪一個。您可能想了解更多關於[評估順序和排序](http://en.cppreference.com/w/cpp/language/eval_order)。 –
* sum *應該是相同的,但是程序中並沒有顯示它。 – molbdnilo
@Someprogrammerdude我看到,在這種情況下,應避免使用總和 –