PaulR有正確的建議。你必須通過「手」來運行代碼(使用任何你想要的工具 - 調試器,紙,日誌函數調用和某些點的變量),直到你理解它爲止。對於代碼的解釋,我會告訴你quasiverse的優秀答案。
也許這可視化稍小的字符串調用圖形使得它更加明顯它是如何工作的:
圖形與graphviz製作。
// x.dot
// dot x.dot -Tpng -o x.png
digraph x {
rankdir=LR
size="16,10"
node [label="permute(\"ABC\", 0, 2)"] n0;
node [label="permute(\"ABC\", 1, 2)"] n1;
node [label="permute(\"ABC\", 2, 2)"] n2;
node [label="permute(\"ACB\", 2, 2)"] n3;
node [label="permute(\"BAC\", 1, 2)"] n4;
node [label="permute(\"BAC\", 2, 2)"] n5;
node [label="permute(\"BCA\", 2, 2)"] n6;
node [label="permute(\"CBA\", 1, 2)"] n7;
node [label="permute(\"CBA\", 2, 2)"] n8;
node [label="permute(\"CAB\", 2, 2)"] n9;
n0 -> n1 [label="swap(0, 0)"];
n0 -> n4 [label="swap(0, 1)"];
n0 -> n7 [label="swap(0, 2)"];
n1 -> n2 [label="swap(1, 1)"];
n1 -> n3 [label="swap(1, 2)"];
n4 -> n5 [label="swap(1, 1)"];
n4 -> n6 [label="swap(1, 2)"];
n7 -> n8 [label="swap(1, 1)"];
n7 -> n9 [label="swap(1, 2)"];
}
嘗試勾畫出來在紙上,或者你也可以嘗試通過代碼單步在調試器。 –
添加一個新的:[編寫一個C程序來打印給定字符串的所有排列](http://www.geeksforgeeks.org/write-ac-program-to-print-all-permutations-of-a- given-string /) –
首先,遞歸只是有時會導致優雅直觀的解決方案。有時候解決方案是優雅的,但並不直觀,因爲我相信它在這裏。有時它既不優雅,也不直觀。會不會有不雅而直觀的東西?我不知道。在這種情況下,您首先需要從概念上理解如何通過交換數組中的各種元素對來創建所有置換。然後,您需要了解如何應用遞歸算法來實現此概念。它可以幫助在每一步在紙上繪製遞歸樹。 – broadbear