【问题标题】:Prolog Recursion breakdownProlog递归分解
【发布时间】:2014-04-05 00:09:42
【问题描述】:

嗨,有人可以分解这个递归代码,这样我就可以完全理解它给出的输出。我真的很困惑它的工作原理:

    listcomb([],[]).
    listcomb([X|Y], [X|Z]) :-
        listcomb(Y,Z).
    listcomb([_|Y],Z) :-
        listcomb(Y,Z).



    ?- listcomb([1,2,3], X).
    X = [1, 2, 3] ;
    X = [1, 2] ;
    X = [1, 3] ;
    X = [1] ;
    X = [2, 3] ;
    X = [2] ;
    X = [3] ;
    X = [].

谢谢

【问题讨论】:

  • 你试过trace看看会发生什么吗?
  • trace 只返回一堆中文 sumbols,认为它坏了哈
  • 你使用的是什么 Prolog 解释器?

标签: recursion prolog


【解决方案1】:

它通过以下方式将第二个参数与第一个参数中所有可能的元素组合统一起来:

  1. 如果列表为空,则完成(第一个子句)。
  2. 一种可能的组合是将列表的头部与列表尾部的所有可能组合结合起来(第二个子句)
  3. 另一种可能的组合是丢弃列表的头部,只返回列表尾部的所有可能组合(第三个子句)。

运行时,谓词将用尽第二个子句,然后回溯到第三个子句,依此类推,直到用尽所有选项并在第一个子句处停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2011-12-09
    • 2014-06-16
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多