2015-10-27 2 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, чем F # (или я пропустил некоторые новости): '.delete'' defaultdict' 'return array' (хотя return тоже существует в F #, но не так); идентификация отключена, что не помогает понять, что начинается и заканчивается; было бы неплохо иметь все сообщение об ошибке, и в этот момент оно тоже было поднято – Sehnsucht

+0

Я боялся, что defaultdict был только python. Сообщение об ошибке бросается на «let shuffle (arr: 'a array) =», который является строкой 7. Я могу найти другие методы для .delete, и я понимаю, что без «возврата» в возвратном массиве, который он будет просто верните. Я в основном просто бросил «возвращаемый массив» там, чтобы проверить, не исправит ли это что-нибудь. Но, остальное я все еще не уверен. – LinkHyrule

+0

это, вероятно, 'return array' (не уверен без точного отступа, я не могу его проверить); в F # вы возвращаете последнее выражение функции no need for return (например, '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" 

Print:

[|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

Смежные вопросы