int fact(int n,int num)
{
if (n <= 0)
return num;
return fact(n - 1, n+num);
}
int main()
{
int c = 1;
c = fact(10000,0);
std::cout << c;
}
執行后 0x00992389 處(位于 study.exe 中)引發的例外: 0xC00000FD: Stack overflow (引數: 0x00000001, 0x00882F94)。
為什么尾呼叫還會堆疊溢位
uj5u.com熱心網友回復:
每當呼叫這個函式,在這個函式執行前都會將之前的代碼地址引數等(也就是呼叫點)入堆疊,等被呼叫的函式執行完將地址出堆疊,程式根據這個資料回傳呼叫點。若遞回呼叫次數太多,就會只入堆疊不出堆疊,于是堆疊就被壓爆了。。。-------------------------
---一條精致的小尾巴---
https://bbs.gnsoft.ltd
-------------------------
uj5u.com熱心網友回復:
普通遞回確實會,但這是尾呼叫,不會創建新的堆疊,為什么也會爆堆疊
uj5u.com熱心網友回復:
其他語言可能對尾遞回(比如JAVA)進行了優化,編譯時將尾遞回優化為while回圈,此時不存在額外的堆疊開銷。但是在C++中據我所知,尾遞回和普通遞回相比,尾遞回只是效率更高,開銷更小,尾遞回相比于普通遞回只存在函式堆疊開銷,但并不是沒有。。。。。。
-------------------------
---一條精致的小尾巴---
https://bbs.gnsoft.ltd
-------------------------
uj5u.com熱心網友回復:
建議能不用遞回就不用遞回,能用尾遞回就不用普通遞回-------------------------
---一條精致的小尾巴---
https://bbs.gnsoft.ltd
-------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49255.html
標籤:C++ 語言
上一篇:求助貼!
下一篇:求助嗚嗚嗚請問這個到底錯在哪啊
