В чем принципиальная разница, если не рассматривать реализацию рекурсии в конкретном языке?
цикл с точки зрения машины это проверка условия, код, прыжок на проверку или прыжок вне цикла
рекурсия, если без проверки, кидает в стек очередной вызов, в следствии чего стек заполняется всё новыми адресами вызова. стек не резиновый и может закончиться