Как говорит @irreputable, даже если ваш код имеет правильное условие завершения, может оказаться, что проблема просто слишком велика для стека (так что стек исчерпан до того, как условие будет достигнуто). Существует также третья возможность: ваша рекурсия вступила в цикл. Например, при поиске в глубине в графе, если вы забудете пометить узлы как посещенные, вы в конечном итоге будете идти по кругу, возвращаясь к узлам, которые вы уже видели.
Как вы можете определить, в какой из этих трех ситуаций вы находитесь? Попытайтесь описать «местоположение» каждого рекурсивного вызова (обычно это включает параметры функции). Например, если вы пишете алгоритм графа, где функция вызывает себя на соседних узлах, то имя узла или индекс узла является хорошим описанием того, где находится рекурсивная функция. В верхней части рекурсивной функции вы можете напечатать описание, а затем вы увидите, что делает функция, и, возможно, вы сможете определить, правильно ли она работает или нет, или она идет по кругу. Вы также можете сохранить описания в HashMap, чтобы определить, вошли ли вы в круг.