2015-10-27 123 views
0

`所以,我對F#非常陌生。我希望這個問題很簡單。我一直在研究和環顧四周。我有一個「不完整的結構化構造在這個表達點之前或之前」的錯誤。我覺得這可能是簡單的,或者我走了。F#查找2個數組/列表之間的缺失元素

的目標是:

有非負整數的數組。第二個數組是 ,它是通過對第一個數組的元素進行整理並刪除一個隨機元素而形成的。給定這兩個數組,找到第二個 數組中缺少哪個元素。線性搜索是不允許的。

let FindMiss list = 
match list with 
| [] -> 
    [] 
|firstElem::otherElements -> 
    let rand = new Random 
    let shuffle (arr : 'a array) = 
      let array = Array.copy arr 
      let n = array.Length 
      for x in 1..n do 
       let i = n-x 
       let j = rand.Next(i+1) 
       let tmp = array.[i] 
       array.[i] <- array.[j] 
       array.[j] <- tmp 
      array 
    return array 
    array.[rand].delete 
|array::list -> 
    let d=collections.defaultdict(int) 
    for num in list do 
     d[num] +=1 
    for num in array1 do 
     if d[num]==0 then return num 
     else d[num]-=1 

printfn "The missing Number is: %A" (FindMiss[4;2;1;7;5;6;3;2]) 
+3

這裏似乎有很多錯誤;有幾件事看起來比Python更Python(或者我錯過了一些新聞):'.delete'' defaultdict''返回數組'(儘管F#中的返回值也存在,但不是這樣);身份已關閉,無助於理解開始和結束的地方;它可能是很好的整個錯誤信息,並在那一點上它也被提出 – Sehnsucht

+0

我擔心defaultdict只是python。錯誤消息是在「let shuffle(arr:'a array)=」這是第7行。我可以找到.delete的其他方法,這是我的理解,沒有返回數組中的「返回」,它會剛回來。我主要只是把「返回數組」放在那裏,看看是否能解決任何問題。但是,其餘的我仍然不確定。 – LinkHyrule

+0

這可能是'返回數組'(不確定沒有確切的縮進我無法測試它);在F#中,你返回不需要返回的函數的最後一個表達式(就像上面的'array'一樣)。我建議你先寫兩個單獨的函數,一個用於洗牌,一個用於搜索兩個「容器」之間的「差異」。你也傾向於混合陣列和列表,你應該選擇一個並堅持下去(第一步)。 – Sehnsucht

回答

0

一開始,更多的可讀性,您可以採取的洗牌和一個單獨的函數刪除隨機元素。對於數組,它們可能看起來像這樣:

let Shuffle arr = 
    let rand = System.Random() 
    arr |> Array.sortBy(fun _ -> rand.Next()) 

let RemoveRandom arr = 
    let rand = System.Random() 
    let lng = arr |> Array.length 
    let index = rand.Next lng 
    [|0..lng - 1 |] 
    |> Array.choose(fun x -> if x = index then None else Some(arr.[x])) 
    |> Shuffle 

進一步定義搜索功能:

let FindMiss arr1 arr2 = 
    let sum1 = arr1 |> Array.sum 
    let sum2 = arr2 |> Array.sum 
    sum1 - sum2 

實施例:

let first = [| 4;2;1;7;5;6;3;2 |] 
first |> printfn "%A" 
let second = first |> RemoveRandom 
second |> printfn "%A" 
FindMiss first second |> printfn "Missing value is %i" 

打印:

[|4; 2; 1; 7; 5; 6; 3; 2|] 
[|2; 2; 3; 7; 1; 5; 6|] 
Missing value is 4 

鏈接:

https://dotnetfiddle.net/g6wKUX

1

任務是重新實現List.except?

如果沒有,只是使用「除了」,那麼:

[1;2;3] |> List.except [1;2] 

或者是任務「列表中隨機取出組件的」?那麼這就是「答案」:https://stackoverflow.com/a/2889972/5514938