0

整数 n を取り、整数 n* を返す関数を定義して、n と n* が 1 から n までの整数の同じセットに含まれるようにしたいと思います。関数は全単射でなければなりません。

私は次のことを試しました

fun bij(n) =
      let 
        val ls = zip(upto (1, n), List.rev(upto (1, n))) 
        val Tw_2 = fn(a, b) => b
      in Tw_2(List.last(ls, n-1)) end;

残念ながら、n のすべての値に対して 1 を返します。私は本当にここで立ち往生しています。これを実装する方法について誰かが私にいくつかのアイデアを教えてもらえますか?

の動作は次のbijようになります

bij(1) = 3
bij(2) = 2
bij(3) = 1
4

1 に答える 1

1

あなたの質問を正しく理解していれば、簡単な解決策は次のとおりです。

fun bij(n, i) = n + 1 - i;

次の表で表すことができます

i         | 1    2    3  ... n-2  n-1  n
bij(n, i) | n  n-1  n-2  ...   3    2  1

1との間の数値に対して期待どおりに機能しますn。直観的に、(正の) 数値ii"" の右側のステップであり、これを(実際には ""の左側の) ステップ0である数値にマッピングします。ii - 1n

リストを介して明示的に上記の表を作成したかったのではないでしょうか?

fun upto(m, n) = if n < m then [] else m :: upto(m+1, n);

fun table n = ListPair.zip (upto(1, n), List.rev (upto(1, n)));

例:

> table 5;
val it = [(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]: (int * int) list

次にi、リストの - 番目のペアを取得するためにxs使用できます

List.nth (xs, i-1)

すべてをまとめる

fun bij(n, i) =
      let
        val table = ListPair.zip (upto(1, n), List.rev (upto(1, n)));
        fun snd(x, y) = y;
      in snd(List.nth (table, i-1)) end;

これは、より複雑な方法を除いて、初期関数と同じことを行います。

于 2013-11-05T06:19:37.103 に答える