Проблема в том, что вам не хватает базового условия.Таким образом, ваша функция работает вечно, пока она не использует всю память, доступную вашей программе, и, наконец, перестает выдавать ошибку ошибки сегментации.
При написании рекурсивных функций вы всегда должны предоставить базовое условие, которое остановит рекурсию.В вашем случае это будет
if(i == 0)
return 1;
Здесь вы в основном говорите, что остановите рекурсию, когда мне станет 0.