Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Understanding Recursion to generate permutations

Tags:

c++

recursion

I find recursion, apart from very straight forward ones like factorial, very difficult to understand. The following snippet prints all permutations of a string. Can anyone help me understand it. What is the way to go about to understand recursion properly.

void permute(char a[], int i, int n) {    int j;    if (i == n)      cout << a << endl;    else    {        for (j = i; j <= n; j++)        {           swap(a[i], a[j]);                     permute(a, i+1, n);           swap(a[i], a[j]);        }    } }   int main() {    char a[] = "ABCD";    permute(a, 0, 3);    getchar();    return 0; } 
like image 497
Nemo Avatar asked Sep 24 '11 08:09

Nemo


People also ask

How do you generate all permutations?

Heap's algorithm is used to generate all permutations of n objects. The idea is to generate each permutation from the previous permutation by choosing a pair of elements to interchange, without disturbing the other n-2 elements.


1 Answers

PaulR has the right suggestion. You have to run through the code by "hand" (using whatever tools you want - debuggers, paper, logging function calls and variables at certain points) until you understand it. For an explanation of the code I'll refer you to quasiverse's excellent answer.

Perhaps this visualization of the call graph with a slightly smaller string makes it more obvious how it works: Call graph

The graph was made with 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)"]; } 
like image 118
user786653 Avatar answered Oct 09 '22 18:10

user786653