首页 > 解决方案 > 递归地在序言中创建一个列表

问题描述

我想在序言中创建一个列表,在每个递归步骤中我将一个元素添加到列表中。我的代码:

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]不会在每个递归中添加一个元素。这样做的正确方法是什么?

标签: prolog

解决方案


你基本上需要写三个子句。首先,从句 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

推荐阅读