终止有限列表

时间:2013-06-10 05:55:50

标签: haskell terminate

pp :: [a] -> [a]
pp list = case list of
    [] -> []
    (x: _) -> x : (qq list)


qq :: [a] -> [a]
qq list = case list of
    [] -> []
    (x: xs) -> (pp xs) ++ [x]

函数pp是否针对有限列表终止?如果是这样的话:如果使用n个元素列表调用pp,那么函数pp和qq的总调用次数是多少?如果pp没有针对有限列表终止,那么为什么不呢。

我认为函数pp将终止,如果使用n个元素列表调用pp,pp和q将总共调用2n。

1 个答案:

答案 0 :(得分:1)

证明递归计算在其输入大小为(a)有限且(b)递减时终止的一种方法。

让我们看一下pp

pp :: [a] -> [a]
pp list = case list of
    [] -> []
    (x: _) -> x : (qq list)

最后一行返回x:qq list,但输入为list,因此它使用相同的长度列表调用qq

让我们看看qq做了什么:

qq :: [a] -> [a]
qq list = case list of
    [] -> []
    (x: xs) -> (pp xs) ++ [x]

在此,我们致电pp xs,我们将list与模式x:xs匹配。这意味着x是头部(第一个元素),xs是尾部(其余列表),因此xs是一个比输入短的元素list

这意味着每次调用qq时输入的长度减1,而当我们调用pp时,输入的长度不会减少。因此,你是正确的,总共有2n个调用,当然是有限的,所以计算终止。