2014-12-03 43 views
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更改列表中的項目?

我是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 

回答

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輔助函數找到兩個值和它們在列表中的位置,併產生一個新的列表是一樣的輸入列表中,除了這兩個值切換。