为什么这个分离功能有效?

时间:2017-03-05 21:32:44

标签: recursion f#

我有一个将列表分成两半的函数。

这是功能:

  let rec split = function
  | []       -> ([],[])
  | [a]      -> ([a],[])
  | a::b::cs -> let (M,N) = split cs
                (a::M, b::N)

我不明白为什么这句话有效(a::M, b::N)。在执行该语句之前,我们不是在调用递归函数吗?所以这句话不应该被执行吗?

1 个答案:

答案 0 :(得分:6)

  

我们在执行该语句之前调用递归函数吗?

  

那句话永远不会被执行吗?

只有递归是无限的,而不是。按原样,递归调用完成后将评估(a::M, b::N)

例如,请考虑调用split [1;2;3]

  split [1;2;3]
= let (M,N) = split [3]
  (1::M, 2::N)
= let (M,N) = ([3], [])
  (1::M, 2::N)
= (1::[3], 2::[])
= ([1;3], [2])

这里什么都没有。