как найти наименьшее число в списке - PullRequest
0 голосов
/ 09 апреля 2020

Если у меня есть список целых чисел, как я могу написать функцию, которая определяет наименьшую положительную разницу между числами в списке? Пример может быть таким:

[1; 3; 5; 6] // difference 1 (between 6 and 5)

Ответы [ 2 ]

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

Теперь я дам вам полное решение, но такое, которое является обобщенным c, так что оно будет работать с любым типом, удовлетворяющим сравнению и ограничениям членов , и также будет работать на любой тип коллекции, который реализует IEnumerable<'T>. Это сместит ваши усилия с выяснения, какие функции использовать, на то, что они на самом деле делают и как они работают вместе.

let inline smallestDiff source =
    source 
    |> Seq.sort
    |> Seq.pairwise
    |> Seq.groupBy (fun (x, y) -> y - x)
    |> Seq.minBy fst
// val inline smallestDiff :
//   source:seq< ^a> ->  ^b * seq< ^a *  ^a>
//     when  ^a : comparison and  ^a : (static member ( - ) :  ^a *  ^a ->  ^b) and
//           ^b : comparison

[1; 3; 5; 6] |> smallestDiff
// val it : int * seq<int * int> = (1, seq [(5, 6)])
1 голос
/ 09 апреля 2020

После обсуждения в комментариях я не буду пытаться написать полное решение, но дам вам подсказку о функциях, которые необходимы для того, чтобы это работало.

Если вы ищете Наименьшая разница между последующими числами, тогда вы можете использовать функцию List.pairwise, которая дает вам список кортежей с последующими числами. Затем вы можете передать это в List.map, чтобы превратить список кортежей в список различий (вычитая одно из другого) и в List.min, чтобы найти наименьшее.

> [1;3;5;6] |> List.pairwise;;
val it : (int * int) list = [(1, 3); (3, 5); (5, 6)]

Если вы ищем наименьшую разницу между любыми двумя числами, затем я сначала отсортировал бы список, используя List.sort, а затем сделал бы то же, что и выше - сортировка списка гарантирует, что числа, которые нужно вычесть, чтобы получить наименьшую разницу, будут рядом друг с другом.

...