DIM list1%(2) : list1%() = 2, 0, 2 PRINT "partitions(2,0,2):" PRINT FNpartitions(list1%()) DIM list2%(2) : list2%() = 1, 1, 1 PRINT "partitions(1,1,1):" PRINT FNpartitions(list2%()) DIM list3%(3) : list3%() = 1, 2, 0, 1 PRINT "partitions(1,2,0,1):" PRINT FNpartitions(list3%()) END DEF FNpartitions(list%()) LOCAL i%, j%, n%, p%, o$, x%() n% = DIM(list%(),1) DIM x%(SUM(list%())-1) FOR i% = 0 TO n% IF list%(i%) THEN FOR j% = 1 TO list%(i%) x%(p%) = i% p% += 1 NEXT ENDIF NEXT i% REPEAT FOR i% = 0 TO n% o$ += " ( " FOR j% = 0 TO DIM(x%(),1) IF x%(j%) = i% o$ += STR$(j%+1) + " " NEXT o$ += ")" NEXT i% o$ += CHR$13 + CHR$10 UNTIL NOT FNperm(x%()) = o$ DEF FNperm(x%()) LOCAL i%, j% FOR i% = DIM(x%(),1)-1 TO 0 STEP -1 IF x%(i%) < x%(i%+1) EXIT FOR NEXT IF i% < 0 THEN = FALSE j% = DIM(x%(),1) WHILE x%(j%) <= x%(i%) j% -= 1 : ENDWHILE SWAP x%(i%), x%(j%) i% += 1 j% = DIM(x%(),1) WHILE i% < j% SWAP x%(i%), x%(j%) i% += 1 j% -= 1 ENDWHILE = TRUE