Пролог - сбалансированное дерево или нет
-
26-10-2019 - |
Вопрос
Я хочу написать программу, которая сообщает мне, сбалансировано дерево или нет. В этом случае сбалансированный означает одинаковую высоту или разницу в высоте 1.
Это то, что я написал до сих пор, но это не работает для разницы в высоте 1. Почему?
balanced(l(_)).
balanced(b(B1, B2)):-
height(B1,H),
height(B2,H),
balanced(B1),
balanced(B2).
balanced(b(B1,B2)):-
height(B1,H + 1),
height(B2,H),
balanced(B1),
balanced(B2).
balanced(b(B1,B2)):-
height(B1,H),
height(B2,H + 1),
balanced(B1),
balanced(B2).
Решение
H + 1
не оценивается по значению H
Плюс один, если вы не говорите Prolog провести арифметическую оценку; Вместо этого Prolog строит термин с +
как функтор и H
а также 1
как аргументы. (Пытаться H + 1 =.. L
и проверьте значение L
Чтобы убедить себя в этом факте.)
Сделай что -то вроде
height(B1, H1),
height(B2, H2),
abs(H1 - H2) =< 1.
=<
будет выполнять арифметическую оценку.
Не связан с StackOverflow