Проблемы с вычислением рекурсивного значения этой функции - PullRequest
0 голосов
/ 30 сентября 2019
let rec f (l: int list) : int * int = 
    begin match l with
    | [] -> (0,0)
    | [x] (x,x)
    | x::y::tl -> let (a,b) = f tl in 
                  (x + a, y + b)
    end

let r = f [2;3;4;5;6]

Я думаю, что ответ вычислится до r = (6,6), потому что если вы продолжите вызывать рекурсивную функцию в хвосте, вы получите последний элемент в списке, поэтому он будет соответствоватьВторой случай, но я понятия не имею, если это правильно или почему это так. На самом деле, я не понимаю использование let (a,b) = f tl in (x + a, y + b).

1 Ответ

0 голосов
/ 30 сентября 2019

Я постараюсь объяснить let (a, b) = f tl in (x + a, y + b). Может быть, это поможет.

Шаблон для этого случая x :: y :: tl. Таким образом, это означает, что tl представляет хвост хвоста списка. Т.е. он представляет список после удаления двух элементов спереди.

В этих же строках x представляет первый элемент списка, а y представляет второй элемент.

Рекурсивный вызов f вернет все, что f вернет для tl, и это то, что вы пытаетесь выяснить. Это будет пара чисел, как вы можете сказать из шаблона (a, b).

Результат всего выражения (который является результатом f, за исключением случаев, когда список очень короткий) равен (x + a, y + b). Другими словами, он добавляет первый элемент списка к первому номеру пары и второй элемент списка ко второму элементу пары.

...