Prolog中squares/2谓词递归实现及代码正确性验证咨询
实现思路评估
你的核心递归逻辑是正确的:边界条件设定空列表对应空平方列表符合规则,递归分支采用分治思路,先计算当前列表头元素的平方值,再递归处理剩余尾列表的逻辑也完全没问题。唯一出错点是谓词参数的顺序和你要求的squares/2接口定义不匹配。
你当前编写的代码实际对应squares(原数字列表, 平方结果列表)的参数规则,但你要求的接口是squares(平方结果列表X, 原正整数列表Y),两个参数的位置刚好写反了。
修正后的递归实现
你可以选择任意一种改法适配需求:
改法1:直接调整参数顺序匹配接口
squares([], []). squares([X|Squared_list], [H|T]):- X is H*H, squares(Squared_list, T).
该版本完全匹配你给出的查询要求,执行查询?- squares(X, [1, 2, 3, 4, 5, 6]).即可直接得到预期输出X = [1, 4, 9, 16, 25, 36]。
改法2:保留原有递归逻辑,新增包装层
如果你不想修改已经写好的递归分支参数顺序,可以加一层接口谓词做参数转发:
% 对外符合要求的调用接口 squares(X, Y) :- squares_inner(Y, X). % 原有递归逻辑仅修改谓词名即可 squares_inner([], []). squares_inner([H|T], [X|Squared_list]):- X is H*H, squares_inner(T, Squared_list).
内容的提问来源于stack exchange,提问作者gmn_1450
相关产品推荐
相关产品推荐

