Хвостово-рекурсивная сумма элементов - PullRequest
0 голосов
/ 13 марта 2019

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

let calc L = L |> List.map (fun x -> (x*3)) |>  List.sum

Как бы я сделал это рекурсивной функцией Tail с вспомогательной функцией.

let _calc result L = 
  match L with 
  | [] -> result
  | hd::tl -> ???

let calc L = 
  match L with 
  | [] -> raise (System.ArgumentException("List cannot be empty"))
  | hd::tl _calc hd tl 

1 Ответ

2 голосов
/ 13 марта 2019

Я не хочу давать ответ полностью, поэтому:

Начните с хвосто-рекурсивного определения sum

let rec _calc result L = 
  match L with 
  | [] -> result
  | hd::tl -> _calc (result + hd) tl

let sum L = _calc 0 L

Что нужно изменить, чтобы умножить каждый элемент на 3?

(Также обратите внимание, что let calc L = L |> List.map (fun x -> (x*3)) |> List.sum вернет 0 в пустом списке, а не вызовет исключение. Нет необходимости также форсировать исключение в вашей хвостовой рекурсивной версии, если только это не является обязательным.)

...