【问题标题】:Bijective function in smlsml中的双射函数
【发布时间】: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) 返回一个介于1n 之间的值,但是你还没有告诉它n 是什么。它需要另一个参数。
  • 在上面的代码中是zip实际上是ListPair.zipupto的定义是什么?此外,List.last 只接受一个参数,您实际上是指哪个函数?您只需要一个满足您的规范的任意函数(想到的最简单的函数是fn x => x ;))还是一个特定的函数?在您的示例中,对于给定的nbij(n, i) 似乎应该将数字1 2 3 ... n(按此顺序)映射到n n-1 n-2 ... 1(按此顺序)?你能澄清一下吗?

标签: sml smlnj ml


【解决方案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

对于1n 之间的数字,它可以正常工作。直观地,一个(正)数字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;

与初始函数的作用相同,只是方式更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2015-06-19
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多