我正在尝试测试括号列表是否有效。我的代码:
checkbrackets([]).
checkbrackets(['('|T]):-
T = [')'|List],
checkbrackets(List).
checkbrackets(['('|T]):-
T = ['('|List],
append(Rest,[')'],T),
checkbrackets(Rest).
我的代码适用于['(', '(', ')', '(', '(', ')', ')', ')']
但它失败了['(', '(', ')', ')', '(', ')']
.
我究竟做错了什么?是否可以在没有计数器等额外参数的情况下编写这样的测试?
your append(Rest, [')'], T)
将解析直到end列表中的,但并没有说左括号最终会与最后一个右括号匹配,例如()()
才不是。
话虽这么说,我认为你让事情变得过于复杂了。您可以在此处使用一次扫描,而不是获取各种子列表:您使用一个初始化的累加器0
,累加器最终应以0
并且永远不会小于零,所以:
checkbrackets(B) :-
checkbrackets(B, 0).
checkbrackets([], 0). %% ← at the end, zero
checkbrackets([')'|T], N) :-
N > 0, %% ← always greater than or equal to zero.
N1 is N-1,
checkbrackets(T, N1).
checkbrackets(['('|T], N) :-
N1 is N+1,
checkbrackets(T, N1).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)