我有一个将列表分成两半的函数。
这是功能:
let rec split = function
| [] -> ([],[])
| [a] -> ([a],[])
| a::b::cs -> let (M,N) = split cs
(a::M, b::N)
我不明白为什么这句话有效(a::M, b::N)
。在执行该语句之前,我们不是在调用递归函数吗?所以这句话不应该被执行吗?
答案 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])
这里什么都没有。