Вопрос

Я хочу написать программу, которая сообщает мне, сбалансировано дерево или нет. В этом случае сбалансированный означает одинаковую высоту или разницу в высоте 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.

=< будет выполнять арифметическую оценку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top