順列

1からNまでの整数の順列を出力するプログラムです。

class Program
{
    private const int N = 4;

    private static int   i;
    private static int[] p;

    internal static void Main(string[] args)
    {
        i = 0;
        p = new int[N + 1];
        for (int k = 0; k < N; k++) Try(k + 1);
    }

    private static void Try(int k)
    {
        i++;
        p[k] = i;
        if (i == N)
        {
            Print();
        }
        else
        {
            for (int j = 0; j < N; j++)
            {
                if (p[j + 1] == 0) Try(j + 1);
            }
        }

        i--;
        p[k] = 0;
    }

    private static void Print()
    {
        for (int i = 0; i < N; i++)
            Console.Write(p[i + 1] + " ");

        Console.WriteLine("");
    }
}

Software Technology 12 コンピュータアルゴリズム事典(名著!)のパクリです。*1
元が Pascal ですから、ちょっと怪しい(^_^;)。
グローバル変数に「i」なんて定義しちゃってるところがすごいですね。あと、やっぱり再帰は不思議だ。
なんでこんなことやってるかっつーと、Visual Studio 2010 の学習のためですが、Call Hierarchy - Visual Studio 2015 | Microsoft Docsの「呼び出し先」「呼び出し元」って逆じゃね?

*1:33p.