2015-10-26 2 views
0

Так что я недавно работал с списками. Я хочу сделать нерекурсивную функцию name: int list -> int, которая возвращает разницу между самым высоким и самым низким числом в списке. Есть простой способ сделать это с возможно list.fold, list.filter or list.exist?Работа с нерекурсивными списками

Я предполагаю, что я могу сделать это с list.max и list.min, но я хочу попробовать с некоторыми другими функциями.

Любая помощь?

+0

'List.fold': да, конечно, -' List.filter 'AFAIK no -' List.Exist' ... well (?) ... можете ли вы выразить это словами, что вы хотите/должны сделать? Подсказка: вы можете перевести каждый цикл в 'fold' довольно механически .... – Carsten

ответ

2

Для вас значит что-то вроде этого?

let distanceMinMax xs = 
    let (min,max) = List.fold (fun (min, max) x -> ((if x < min then x else min), (if x > max then x else max))) 
           (System.Int32.MaxValue, System.Int32.MinValue) 
           xs 
    (max - min) 

Испытано в РЕПЛ:

> distanceMinMax [1;-1;2;5;7;-3];; 
val it : int = 10 

Подсказка: Пустой список [] не поддерживается:

> distanceMinMax [];; 
val it : int = 1 
+0

Вы можете обрабатывать пустой случай списка с помощью опции; возвращая None и некоторое расстояние в противном случае (как в сторону вы ставите max вместо min внутри первого, если - я не могу редактировать, потому что слишком мало символов) – Sehnsucht

+0

Приятный намек @Sehnsucht! Я только что исправил эту функцию. – Olaf

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