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。我真的被困在这里了。谁能给我一些关于如何实现这一点的想法?

的行为bijmust 看起来像

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”的步数,我们将其映射到i(实际上i - 1)“向左n”的步数。

也许您想通过列表显式构建上表?

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第 -th 对列表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 回答