[xsl] Show all permutations of N coins ... without using recursion?

Subject: [xsl] Show all permutations of N coins ... without using recursion?
From: "Costello, Roger L." <costello@xxxxxxxxx>
Date: Sat, 31 Aug 2013 11:50:12 +0000
Hi Folks,

I want to print out all permutations of N coins.

If N = 3 then I can find all permutations using a triply nested loop:

        <xsl:for-each select="('H','T')">
            <xsl:variable name="coin1" select="." />
            <xsl:for-each select="('H','T')">
                <xsl:variable name="coin2" select="." />
                <xsl:for-each select="('H','T')">
                    <xsl:variable name="coin3" select="." />
                    <xsl:value-of select="concat($coin1, $coin2, $coin3, '
')"/>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>

Output: HHH HHT HTH HTT THH THT TTH TTT

If N is arbitrary, then that approach won't work. So I created a recursive
function that does the job, which I show below. Now I want to eliminate the
recursion and use loops instead. How do I do that? Would you please show me
how to output all permutations of N coins, without using recursion?  /Roger

-----------------------------------------------------------------------
           Show all permutations of N coins
-----------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                xmlns:map="http://www.w3.org/2005/xpath-functions/map";
                xmlns:xs="http://www.w3.org/2001/XMLSchema";
                xmlns:f="function"
                version="3.0">

    <xsl:template match="/">
        <xsl:value-of select="f:show-coins(4, '')" />
    </xsl:template>

    <xsl:function name="f:show-coins">
        <xsl:param name="N" as="xs:integer" />
        <xsl:param name="coins" as="xs:string*" />

        <xsl:choose>
            <xsl:when test="$N eq 0">
                <xsl:value-of select="concat($coins, '  ')" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:for-each select="('H','T')">
                    <xsl:value-of select="f:show-coins($N - 1, concat($coins,
.))" />
                </xsl:for-each>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:function>

</xsl:stylesheet>

Current Thread