F # Рекурсивная функция для добавления четных элементов списка - PullRequest
0 голосов
/ 22 марта 2019

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

let even = List.filter(fun x -> x%2=0)[1..100]
let sum = List.length even

printfn "Even: %A sum: %d " even sum

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 22 марта 2019

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

  let rec getEven (input : int list) (acc: int list)  = 
    match input with
    | head :: tail when head % 2 = 0 -> (getEven tail (head :: acc))
    | head :: tail when head % 2 = 1 -> (getEven tail (acc))
    | _ -> acc

  let even = getEven [1..10] []
  let sum = List.sum even

Приведенная выше функция выдаст:

val getEven : input:int list -> acc:int list -> int list
val even : int list = [10; 8; 6; 4; 2]
val sum : int = 30

PS для вычисления суммы элементов, вы должны использовать List.sum вместо List.length, который вернет вам количество элементовв спискеТакже обратите внимание, что вы можете вычислять сумму четных элементов в функции getEven, сохраняя не список четных элементов, а их сумму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...