Проще понять так: возьми
return find(current + 5, `(${history} + 5)`) ||
find(current * 3, `(${history} * 3)`);
Представь, что левый return - это левая ветка, а правый - правая. Сначала ты будешь проваливаться по левой ветке и дойдешь до 26, после этого у тебя вернется
null
так как 26 > 24. Предыдущий return, получив
null
прыгнет в правую часть условия (где у тебя все умножается на 3), но и там будет тоже
null
, так как 21 * 3 = 63 (что больше 24-х). Функция вернет тебя еще на уровень выше в правую ветку, так как из общей левой у тебя вернулся
null
. Ты пойдешь так "наверх", пока не встретишь условие, где будет 6 * 3 = 18. У тебя в сумме будет 19. И после этого ты войдешь опять в правую ветку, где будет 19 + 5, что даст тебе желанное 24 и выход из функции
Постарался на пальцах объяснить
А по поводу торможения. Рекурсия просто требует определенного времени, чтобы в нее "въехать".