prolog - 递归地在序言中创建一个列表
问题描述
我想在序言中创建一个列表,在每个递归步骤中我将一个元素添加到列表中。我的代码:
solve(N,List):-
N>5,
solve(N-1,[a|List]),
N<5,
solve(N-1,[b|List]),
N is 0.
这应该运行递归,根据 N 将 a 或 b 添加到列表中。但是,这[a|List]
不会在每个递归中添加一个元素。这样做的正确方法是什么?
解决方案
你基本上需要写三个子句。首先,从句 for N = 0
。
solve(0, []).
当N
小于(或等于)5 时,您要添加b
到列表中。您还需要检查 N 不是负数,否则您的程序将在无穷大处递归。您还需要N - 1
使用is
谓词进行计算。
solve(N, [b | L]) :-
N >= 0,
N =< 5,
M is N - 1,
solve(M, L).
第三个子句针对 whereN
大于的情况5
,将 wherea
添加到列表中。
solve(N, [a | L]) :-
N > 5,
M is N - 1,
solve(M, L).
分别查询 forsolve(2, L)
和solve(7, L)
yield:
L = [b, b] % N = 2
L = [a, a, b, b, b, b, b] % N = 7
推荐阅读
- c++ - 数据未写入我的 .dat 文件
- javascript - 在 SAP Fiori 所有页面中加载外部 JS
- java - 将 java.nio.file.Path 转换为 File 失败
- python - 如何替换列表中的值
- windows - 127.0.0.1 适用于 Chrome,但不适用于 Edge
- c++ - LNK2019:使用 std::ifstream 时未解析的外部符号
- android-studio - 每次我运行它时,android应用程序都会意外崩溃
- php - cpanel子域错误的laravel项目:HTTP ERROR 500
- json - 使用 JOLT 转换过滤 JSON
- mysql - MySQL:每次选择行出现在查询结果中时,我们可以自动增加一个字段吗?