这个函数如何处理 2 个列表?
How is this function dealing into 2 lists?
这个自创函数的目的是接受一个列表,并输出2个列表,它们将交替插入到列表中。所以 [4,5,1,6,7,8] 将被处理成 2 个列表,例如 ([4,1,7],[5,6,8])
deal :: [a] -> ([a],[a])
deal [] = ([],[])
deal [x] = ([x],[])
deal (x:xs) = let (ys,zs) = deal xs
in (x:zs, ys)
这是函数。我不明白 let (ys,zs) = deal xs 发生了什么,我知道它基本上为 2 个列表创建了一个占位符但是有人可以引导我完成正在发生的递归。
根据定义,
deal [8] = ([8], [])
现在:
deal [7,8]
= deal (7:[8])
= let (ys,zs) = deal [8]
in (7:zs, ys)
-- from the recursion we discover ys=[8], zs=[]
= (7:[], [8])
= ([7], [8])
再次:
deal [6,7,8]
= deal (6:[7,8])
= let (ys,zs) = deal [7,8]
in (6:zs, ys)
-- from the recursion we discover ys=[7], zs=[8]
= (6:[8], [7])
= ([6,8], [7])
等等。每次我们递归时,我们都会交换前一个结果对并将一个项目添加到第一个组件之前。由于交换,这就像将一个元素添加到第一个组件,然后添加到第二个组件,然后再添加到第一个组件,依此类推,交替进行。粗略地说,这将列表分成两半。
这个自创函数的目的是接受一个列表,并输出2个列表,它们将交替插入到列表中。所以 [4,5,1,6,7,8] 将被处理成 2 个列表,例如 ([4,1,7],[5,6,8])
deal :: [a] -> ([a],[a])
deal [] = ([],[])
deal [x] = ([x],[])
deal (x:xs) = let (ys,zs) = deal xs
in (x:zs, ys)
这是函数。我不明白 let (ys,zs) = deal xs 发生了什么,我知道它基本上为 2 个列表创建了一个占位符但是有人可以引导我完成正在发生的递归。
根据定义,
deal [8] = ([8], [])
现在:
deal [7,8]
= deal (7:[8])
= let (ys,zs) = deal [8]
in (7:zs, ys)
-- from the recursion we discover ys=[8], zs=[]
= (7:[], [8])
= ([7], [8])
再次:
deal [6,7,8]
= deal (6:[7,8])
= let (ys,zs) = deal [7,8]
in (6:zs, ys)
-- from the recursion we discover ys=[7], zs=[8]
= (6:[8], [7])
= ([6,8], [7])
等等。每次我们递归时,我们都会交换前一个结果对并将一个项目添加到第一个组件之前。由于交换,这就像将一个元素添加到第一个组件,然后添加到第二个组件,然后再添加到第一个组件,依此类推,交替进行。粗略地说,这将列表分成两半。