Data Structures, Algorithms, & Applications in C++
Chapter 2, Exercise 25

Let s(k,n) be the number of swaps done when perm is invoked as perm(a, k, n). s(k,n) = 0 when k = n and (n - k + 1)(2 + s(k+1, n)) when k < n. Using repeated substitution, we get

s(1,n) = 2n + 2n(n - 1) + 2n(n - 1)(n - 2) + ... + 2n(n - 1)(n - 2) ... 2

= 2n! [sum from (i=1) to (n-1) (1 / (i!))]