2014-12-03 3 views
1

나는 튜플의리스트를 가지고있다. 나는이리스트에서 두개의 튜플을 무작위로 선택하고이 튜플을 교환하고 싶다. 예를 들어 ((0, 0), (1, 0), (1, 1), (1, 2), (2, 2), (0, 2) 등의 목록이있는 경우sml을 사용하여 목록에서 항목을 변경하는 방법은 무엇입니까?

그런 다음 무작위로 두 개의 튜플을 선택하십시오. (0, 0), (1, 1), (1, 2), ((1, 0), 2, 2), (0, 2)).

나는 SML을 처음 사용하는데, 고생하고있다. psudo-code가 있습니다. 내가 맞지 않다고 생각합니다. 누구든지 올바른 것을 도와 줄 수 있습니까? :

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 

답변

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 도우미 함수를 사용하고, 제외한 입력리스트와 동일한 새로운리스트를 생성 이 두 값이 전환됩니다.

관련 문제