为什么我的列表冲销只能在一个方向上正常工作?

尼古拉斯·哈伯德(Nicholas Hubbard):

我产生了以下代码。

list_reverse([],[]). 
list_reverse([X],[X]).
list_reverse(Ls,[R|Rs]) :-
    last_elem(Ls,R),
    without_last_elem(Ls,Next),
    list_reverse(Next,Rs).

last_elem([E],E).
last_elem([_|Xs],E) :-
    last_elem(Xs,E).

without_last_elem([X,_|[]],[X|[]]).
without_last_elem([X|T0],[X|T1]) :-
    without_last_elem(T0,T1).

滑动:

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

这正是我想要的。

但是,如果我朝相反的方向前进,我会获得成功,然后才能终止。

?- list_reverse(X,[1,2,3]).
X = [3, 2, 1] ;
  C-c C-cAction (h for help) ? a
abort
% Execution Aborted

我一直在努力理解的原因是为什么我首先要为X获得正确的解决方案。我的程序是否正确?

我不担心倒排清单,也不必担心获得正确解决方案然后终止的模式。这是我已经遇到过几次的模式。

威廉·范昂塞姆(Willem Van Onsem):

last_elem/2可以保持较大的建设名单,这都应该被拒绝。但是您因此陷入了无限循环。

我们可以创建一个与累加器一起使用的函数,并同时对两个列表进行迭代这意味着一旦左列表右列表用尽,将不再进行递归调用:

reverse(L1, L2) :-
    reverse(L1, [], L2, L2).

reverse([], L, L, []).
reverse([H|T], L1, R, [_|T2]) :-
    reverse(T, [H|L1], R, T2).

因此[H|T][_|T2]模式都会弹出列表的第一项,并且只有两个列表都用完时我们才匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

jQuery脚本只能在一个方向上正常工作

为什么我的列表反向功能只能自己工作,而不能在另一个功能中工作?

为什么我的发射只在一个方向上工作?

为什么我的循环只能在第一次迭代中正常工作?

为什么我的单选输入只能在整个数组映射的数组列表中选择一个选项?

为什么我的Stacknavigator只能在一个屏幕上工作而不在另一个屏幕上工作?

Android SwipeGesture仅在一个方向上工作,我不知道为什么吗?

@ManyToMany保存关系只能在一个方向上使用一次

为什么我只能在while循环之外获取数组的最后一个元素

为什么传入的参数只能在一个地方工作而不能在另一个地方工作?

为什么我的网站的滑块只能在Mac(相同的浏览器)上正常工作?

为什么我的 addeventlistener 只能按一个按钮工作?

为什么这只能在页面加载时正常工作?

为什么图像旋转动画只能在第一次正常工作

为什么我不能在一个模板中显示两个列表视图?

为什么我只能在 swift 5 的表视图中看到数组的最后一个元素?

为什么我只能在控制器Blazor / aspnet core 3上调用一个动作?

为什么我不能在工作目录中创建一个新文件?

为什么我不能在Apache的POI一个工作簿链接到另一个?

为什么我的动画只能在预览中工作?

为什么一个用户只能在django的表单中添加一条记录?

为什么只能在一个语句中声明和初始化var?

条件格式:为什么这只能在一个单元格中起作用?

在球拍中,我创建了一个函数来查找列表中的最大值,但是我的一些测试用例无法正常工作,为什么其中一些无法正常工作?

为什么我的Excel VBA宏只能在两个类似的网站之一中工作,以查找高尔夫球手的障碍并捕获结果?

为什么我只能插入一个数字而不是一个名字?

更改颜色多个按钮颜色的功能只能在同一个按钮中正常工作

为什么iperf3在一个方向上显示雷电速度3 Gbit,而在另一个方向上仅显示500 Mbit?

为什么有时将字符串写在一个方向上,有时又写在另一个方向上?