【发布时间】:2013-11-02 21:07:58
【问题描述】:
我想定义一个函数,它接受一个整数 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
【问题讨论】:
-
你可能想定义一个函数,它接受一个整数 n 并返回一个函数,该函数接受一个整数 m 并返回一个整数 m* 使得 m 和 m* 在同一组整数中1到n?
-
我不明白,在您的第一个示例中,n=1 和 n*=3。那么 n 和 n* 是如何在从 1 到 n 的同一组整数中的呢?当然,n* 应该是 1 到 n 之间的整数。你能详细说明一下吗?
-
好吧,也许我没能解释我真正想要的是什么,大局是这样的:我有一个列表 '[2,1,3]',我想要一个可以重新排列这个列表的函数以 '[1,2,3]' 为例。
-
有些东西不见了...你希望
bij(1)返回一个介于1和n之间的值,但是你还没有告诉它n是什么。它需要另一个参数。 -
在上面的代码中是
zip实际上是ListPair.zip?upto的定义是什么?此外,List.last只接受一个参数,您实际上是指哪个函数?您只需要一个满足您的规范的任意函数(想到的最简单的函数是fn x => x;))还是一个特定的函数?在您的示例中,对于给定的n,bij(n, i)似乎应该将数字1 2 3 ... n(按此顺序)映射到n n-1 n-2 ... 1(按此顺序)?你能澄清一下吗?