首页 文章

如何使用sml更改列表中的项目?

提问于
浏览
1

我有一个元组列表,我想有一个函数,在这个列表中随机选择两个元组然后交换这两个元组 .

例如,如果我有一个列表为((0,0),(1,0),(1,1),(1,2),(2,2),(0,2)),那么,随机选择两个元组 . 如果选择(0,0)和(1,0),则该函数的返回结果为((1,0),(0,0),(1,1),(1,2),( 2,2),(0,2)) .

我是SML的新手,我在努力奋斗 . 有一个psudo代码,我想这是不对的,任何人都可以帮助我正确的? :

fun permutation(lst:(int*int) list)=
  let
    val nextInt = Random.randRange (1,List.length(lst))
    val r = Random.rand (1,1)
    val x1 = nextInt r
    val x2 = nextInt r
    val temp = sub(lst,r1)
    update(lst,r1,sub(lst,r2))
    update(lst,r2,temp)
  in
    lst
  end

1 回答

  • 0

    你可以做的简单的事情就是创建一个带有两个索引和一个列表的辅助函数,并在这些索引处返回两个元组 . 就像是

    fun get_two (i1, i2, xs) =
      let
        fun aux (_, _, [], _, val1, val2) = (val1, val2)
          | aux (i1, i2, x::xs, current_index, val1, val2) =
              if i1 = current_index
              then aux (i1, i2, xs, current_index + 1, SOME x, val2)
              else if i2 = current_index
              then aux (i1, i2, xs, current_index + 1, val1, SOME x)
              else aux (i1, i2, xs, current_index + 1, val1, val2)
      in
        aux (i1, i2, xs, 0, NONE, NONE)
      end
    

    然后编写另一个接受列表的函数,使用此get_two辅助函数在列表中查找两个值及其位置,并生成一个与输入列表相同的新列表,除非切换了这两个值 .

相关问题