sml中的双射函数
我想定义一个函数,它接受一个整数n并返回一个整数n*,使得n和n*位于从1到n的同一组整数中,并且该函数必须是双射的 我尝试了以下方法sml中的双射函数,sml,smlnj,ml,Sml,Smlnj,Ml,我想定义一个函数,它接受一个整数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。我真的被
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)));
然后要获取列表的第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;
它的作用与初始函数相同,只是方式更复杂。您是否希望定义一个函数,该函数接受整数n并返回一个函数,该函数接受整数m并返回整数m*,这样m和m*位于从1到n的同一组整数中?我不明白,在您的第一个示例中,n=1,n*=3。那么n和n*是如何在从1到n的同一组整数中的呢?当然,n*应该是介于1和n之间的整数。你能不能请elaborare?也许我没有解释我真正想要的是什么,大局是这样的:我有一个列表“[2,1,3]”,我想要一个将这个列表重新排列回“[1,2,3]”的函数。例如,这里缺少一些东西。。。您希望
bij(1)
返回一个介于1
和n
之间的值,但您没有告诉它n
是什么。它需要另一个参数。在上面的代码中是zip
实际上ListPair.zip
?那么到的定义是什么?此外,List.last
只接受一个参数,您实际指的是哪个函数?您只需要满足您的规范的任意函数(想到的最简单的函数是fnx=>x
;)还是特定的函数?在您的示例中,似乎对于给定的n
,bij(n,i)
应该映射数字13。。。n
(按此顺序)到n n-1 n-2。。。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;