рекурсивная функция для 2D списка - PullRequest
0 голосов
/ 26 апреля 2020

Я очень новичок в f #, поэтому, пожалуйста, прости мое невежество. У меня есть 2D список Int. Я пытаюсь сделать функцию, которая будет возвращать другой 2D-список, который будет содержать только самые нижние элементы хвоста. Примерно так:

   [[2, 3]
    [2, 4]
    [2, 5]              [[2, 3]
    [3, 8]      =>       [3, 2]
    [3, 6]               [4, 1]]
    [3, 2]
    [4, 1]]

Я могу найти минимальное значение 1D списка с

let findMin items = 
    match items with
    | [] -> ()
    | head :: tail ->
        let rec recMin minSoFar items =
            match items with
            | [] -> minSoFar
            | head :: tail ->
                if head < minSoFar then
                    recMin head tail
                else
                    recMin minSoFar tail
        recMin head tail

, которое я скопировал из этого ответа. Любая помощь будет оценена.

1 Ответ

1 голос
/ 27 апреля 2020

Вы говорите о 2D-списках, но ваш пример ввода - это фактически список списков кортежей (где каждый список содержит только одно значение кортежа). Я предполагаю, что это опечатка, и вы хотели написать ; вместо ; и создать фактический 2D-список:

let input = 
  [ [2;  3]
    [2;  4]
    [2;  5]  
    [3;  8]  
    [3;  6]  
    [3;  2]
    [4;  1] ]

Теперь три элемента, которые вы хотите получить в результате, кажутся быть тремя подсписками с наименьшим последним элементом в списке. Самый простой способ получить их - отсортировать список списков по последнему элементу подсписков, а затем взять первые 3:

input 
|> List.sortBy List.last
|> List.take 3  

. Возвращает три подсписка, которые вы хотите, но не в Оригинальный заказ. Если вы хотите, чтобы они были в исходном порядке, вы можете сначала найти третий наименьший последний элемент, а затем использовать его для фильтрации исходного списка:

let last = 
  input 
  |> List.map List.last
  |> List.sort
  |> List.item 2

input 
|> List.filter (fun l -> List.last l <= last)

Обратите внимание, что мой код неправильно обрабатывает такие случаи, как ввод меньше 3 или пустые списки, но это должно дать вам представление об одном из способов решения этой проблемы.

...