// Returns all the partitions of an integer. // NOTE: This class is no longer necessary as Frink now has a built-in // partitions function. // // The algorithm is Algorithm P from Knuth's 7.2.1.4 partitionInteger[n] := { a = new array[] // Array of size n+1 results = new array a@0 = 0 m = 1 count = 0 // Step P2 a@m = n q = m - (n==1 ? 1 : 0) do { // Step P3... dump the partition. // This would be a good place for a "yield" statement. results.push[sliceLength[a,1,m]] count = count + 1 if a@q == 2 { // Step P4 a@q = 1 q = q - 1 m = m + 1 a@m = 1 } else { // Step P5 if q == 0 return results x = a@q - 1 a@q = x n = m-q+1 m = q + 1 while (n > x) { a@m = x m = m + 1 n = n - x } // Simulate Step P2 a@m = n q = m - (n==1 ? 1 : 0) } } while (true) return results }