※ 引述《IhateOGC (我討厭)》之銘言:
: 開發平台(Platform): (Ex: Win10, Linux, ...)
: 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: http://tinyurl.com/y4hq4vfg
: 錯誤結果(Wrong Output):i
: Stdout:
: runtime error: reference binding to null pointer of type 'struct value_type'
: (stl_vector.h) - leet code spiral
: 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
: void reverseString(vector<char>& s) {
: static int i = 0 ;
: static char *p = nullptr;
: if( &s[0] != p )
: {
: p = &s[0];
: i = 0;
: cout << "init i " << endl;
: }
: cout << "i1 = " << i << endl;
: if( i >= (s.size()/2) )
: return;
: cout << "i2 = " << i << endl;
: swap( s[i] , s[s.size()-1-i]);
: i++;
: reverseString(s);
: }
: 補充說明(Supplement):
: 我的i怎不會跑...
你的程式碼雖然有遞迴呼叫但不像經過遞迴思考寫出來的 xD
遞迴呼叫不只可以幫助縮小操作範圍, 也可以重新定義問題大小.
如果問題大小拆分得好, 函式裡就不會有和原輸入資料相關的邏輯
, 像是 &s[0], s.size() 等..
剛好標準函式庫裡的 std::span 可以幫我們改善這個問題, 因為是
很小的類別, 你可以自己實作或把 span-lite 源碼直接複製來用
cppreference https://bit.ly/2Hrjlro
span-lite https://bit.ly/2TGRABr
這題用到的成員函式為:
front(), back(), subspan(), size()
實作需要的工不多, 卻可以大幅提升可讀性. 而且 base case 處理
好的話連除錯都不需要, 這也是遞迴帶來的好處
example https://bit.ly/2XNNRRU