Правильна відповідь полягає в тому, що ця функція не припиняється для всіх цілих чисел (конкретно, вона не закінчується на -1). Ваш друг вірно заявив, що це псевдокод, а псевдокод не закінчується при переповненні стека. Псевдокод формально не визначений, але ідея полягає в тому, щоб він робив те, що говориться на бляшанці. Якщо в коді не сказано "припинити з помилкою переповнення стека", помилка переповнення стека не буде.
Навіть якби це була справжня мова програмування, правильною відповіддю все одно було б "не припиняється", якщо тільки використання стека не є частиною визначення мови. Більшість мов не визначають поведінку програм, які можуть переповнювати стек, тому що важко точно знати, скільки стека буде використовувати програма.
Якщо запуск коду на фактичному інтерпретаторі чи компіляторі викликає переповнення стека багатьма мовами, це розбіжність між формальною семантикою мови та реалізацією. Як правило, розуміється, що реалізація мови зробить лише те, що можна зробити на конкретному комп'ютері з обмеженою пам'яттю. Якщо програма вмирає з переповненням стека, ви повинні придбати більший комп'ютер, перекомпілювати систему, якщо потрібно для підтримки всієї цієї пам’яті, та повторіть спробу. Якщо програма не припиняється, можливо, вам доведеться продовжувати робити це назавжди.
Навіть той факт, що програма буде або не переповнює стек, не є чітко визначеним, оскільки деякі оптимізації, такі як оптимізація хвостових викликів та запам'ятовування, можуть дозволити нескінченний ланцюг викликів функцій у постійному обмеженому просторі стека. У деяких специфікаціях мови навіть передбачено, що реалізація виконує оптимізацію хвостових викликів, коли це можливо (це звичайно для функціональних мов програмування). Ця функція f(-1)
розширюється до f(f(-2))
; зовнішній виклик до f
- це хвостовий дзвінок, тому він нічого не натискає на стек, таким чином, f(-2)
переходить лише до стека, і він повертається -1
, тому стек повертається до того ж стану, в якому він був на початку. Таким чином, з оптимізацією хвостових викликів f(-1)
петлі назавжди в постійній пам'яті.