【问题标题】:termination of finite lists有限列表的终止
【发布时间】:2013-06-05 17:43:59
【问题描述】:
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 对于有限列表是否终止?如果是这样:如果 pp 是用 n 个元素的列表调用的,那么函数 pp 和 qq 总共调用一次的频率是多少?如果 pp 对于有限列表不终止,那为什么不终止。

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

【问题讨论】:

  • 闻起来像作业……你自己试过解决吗?
  • 拿起笔和纸,用列表[1, 2, 3, 4, 5]完成它,然后你可以告诉我们它是否终止以及对复杂性的合理猜测

标签: haskell terminate


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

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多