[英]Bijective function in sml
我想定义一个函数,该函数需要一个整数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
如果我正确理解您的问题,一个简单的解决方案是:
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
之间的数字,它按预期工作。 直观地讲, i
(正数)是i
“ 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
然后要获取列表xs
第i
对,可以使用
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;
它的功能与初始功能相同,只是更复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.