Re: [問題] 自己定義的邏輯用遞迴來跑要如何思考?

作者: ACMANIAC (請肥宅救救肥宅)   2015-01-25 06:17:54
※ 引述《hank951 (法克)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: C
: 問題(Question):
: 想了解大概要怎麼思考這種題型
: 餵入的資料(Input):
: 輸入一個整數 例如3或4
: 預期的正確結果(Expected Output):
: if 3
: 000
: 001
: 010
: 011
: 012
: if 4
: 0000
: 0001
: 0010
: 0011
: 0012
: 0100
: 0101
: 0102
: 0110
: 0111
: 0112
: 0120
: 0121
: 0122
: 0123
: 補充說明(Supplement):
: 這種格式若是要思考用遞迴(backtracking)要怎麼下手比較好呢
http://codepad.org/mk3FG9J6
思考完規律以後,可以先想辦法把它畫成樹狀圖。
level
0 0
/ \
1 0 1
/ \ /|\
2 0 1 0 1 2
... ... /|\....
3 0 1 2
畫完以後就可以想想,這圖和程式碼的關係為何:
1.當前節點是個要印的數字
// int number
2.每條邊是 function-call,
所以如果當前節點有 3 條邊連接子節點就要放個迴圈跑 3 遍。
// for (...) { back_tracking(...); }
3.觀察規律得知,子節點的數量 是 到目前為止最大數 + 2,
所以迴圈要跑這麼多次。
// if (max_number < number) max_number = number;
// for (i : max_number + 2)
4.在葉節點結束,所以要設終止條件。
// if (level + 1 == depth) { return; }
5.在結束時要把路徑上遇到的數字印出來,所以路徑上的數字要存進 buffer。
// char buffer[BUFFER_SIZE];
// buffer[level] = '0' + number;
// if (is leaf) { cout << buffer << endl; }
應該很清楚了吧。

Links booklink

Contact Us: admin [ a t ] ucptt.com