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。
答案 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个调用,当然是有限的,所以计算终止。