Довольно очевидно, что происходит, и вы правы со значением по умолчанию case
. Если ваш ввод prop
не соответствует ни одному из случаев, которые вы вызываете:
simplify(prop)
с тем же аргументом. Поскольку ранее это вызывало рекурсивный вызов simplify()
, и вы вызываете свою функцию с тем же вводом, он снова вводит simplify()
. Так что это не бесконечный цикл, а рекурсивный вызов, который никогда не завершается:
...simplify(simplify(simplify(simplify(simplify(simplify(simplify(prop)))))))
Однако исправить (в зависимости от вашего кода) просто:
if (simplify(prop) == prop) prop
else prop
просто замените его на ...
case _ => prop
Обе ветви возвращают одно и то же значение. Это на самом деле правильно, если вы думаете, если на какое-то время. У вас есть набор оптимизаций. Если ни одно из них не соответствует вашим выражениям, это означает, что его больше нельзя упростить. Следовательно, вы возвращаете его как есть.
Кстати, похоже, вы делаете упрощение логических выражений с помощью классов case. Вас может заинтересовать моя статья , где я делаю то же самое, но с арифметическими выражениями.