2016-11-01 4 views
0

Мне нужна рекурсивная функция в F #, которая дает мне самое большое значение непустого списка. пример:F #: рекурсивная функция для поиска большего значения в непустом списке

biggest [2;4;5;3;9;3] 

должна вернуть 9

Update 1

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

let rec highest l = 
    match l with 
    |[] -> 0 
    |x::y::xs -> if x > y then highest x::xs 
       else highest y::xs 

Но это не сработает. Я не могу использовать функции F #, это, конечно, для обучения. Извините, если вы потеряете некоторое время и спасибо за вашу помощь.

+0

Если это домашнее задание, пожалуйста, укажите поэтому в вопросе. В противном случае люди, которые отвечают, не имеют подходящего контекста. –

+4

Почему это должно быть рекурсивным? List.max делает то, что вы хотите. – hvester

+3

@hvester, вероятно, потому, что это домашнее задание. – mydogisbox

ответ

3

Перед ответом: этот вопрос странный, и Stackoverflow, вероятно, не лучшее место для него.

  • Если это производственный код, используйте List.max. (Puns в сторону, рекурсия не является его собственной наградой ...)
  • Если это для домашней работы, попробуйте понять рекурсию вместо делегирования ваших упражнений случайным людям в Интернете.
  • Если это головоломка/код для гольфа, это неправильный сайт, и может быть яснее, что это за требования.

Во всяком случае, это может ответить, как опубликовано, с учетом следующих требований:

  • Решение хвостовой рекурсией, а не просто рекурсивной. Очевидно, я не хочу писать функцию для замены List.max просто для того, чтобы лишний раз увеличить стек.
  • Функция biggest, которая вызывается в коде вопроса, является непосредственно рекурсивной и не получает дополнительных аргументов. Если я беру вопрос буквально, это, по-видимому, является требованием, поэтому я не могу использовать аккумулятор.

List.max is implemented with a mutating loop and therefore doesn't qualify (link goes to F# source code). Таким образом, это требует пользовательской реализации:

let rec biggest = function 
    | h1 :: h2 :: t -> biggest ((max h1 h2) :: t) 
    | [result] -> result 
    | [] -> failwith "list empty" 

Это довольно странное решение, но это не то, что просил и работает для длинных списков.

+1

Почему вы не использовали внутреннюю функцию с аккумулятором, чтобы заполнить «требование подписи», не имея необходимость «быть странным»? – Sehnsucht

+0

@ Vandroiy Ваш код - это то, что искал, я был близок к вашему ответу, но что-то не так в моем коде. Я просто изучаю рекурсию, не хочу беспокоить людей в Интернете, мои оправдания, если я сделал это с вами. Большое спасибо – Seb

+1

@Sehnsucht это может быть обман. Функция, вызываемая в вопросе, должна быть рекурсивной, а не функцией, вызываемой им. Требование быть рекурсивным произвольно в любом случае, поэтому более строгое правило также может быть правильным. Поэтому, конечно, я использую самую строгую интерпретацию. : P – Vandroiy

0

Спустя несколько дней думать о ней и с некоторой помощью в школе я придумал это, это альтернативное решение Вандрой в одном:

let rec max_value l = 
    match l with 
    |[] -> [] 
    |[x] -> [x] 
    |(x::y::xs) -> if x<y then max_value (y::xs) 
        else max_value (x::xs) 

Большое спасибо