void foo(int m, int n) { if(n = =0) return 1; if(n%2 = =1) return (foo(m*m,n/2)*m);return (foo(m*m,n/2));}
2 回答

心有法竹
TA貢獻(xiàn)1866條經(jīng)驗 獲得超5個贊
首先第1層,m=2 n=7 n%2 = =1成立執(zhí)行foo(m*m,n/2)*m也就是foo(4, 3)*2
第2層,m=4 n=3 n%2 = =1成立執(zhí)行foo(m*m,n/2)*m也就是foo(16, 1)*4
第3層,m=16 n=1 n%2 = =1成立執(zhí)行foo(m*m,n/2)*m也就是foo(256, 0)*16
第4層,m=256 n=0 n = =0成立執(zhí)行返回1
回到第3層,計算1*16,返回16
回到第2層,計算16*4,返回64
回到第1層,計算64*2,返回128
最終結(jié)果就是128
不過你的foo返回值寫錯了,不是void,應(yīng)該是int

米琪卡哇伊
TA貢獻(xiàn)1998條經(jīng)驗 獲得超6個贊
n = =0是這個遞歸函數(shù)的出口
遞歸就相當(dāng)于進(jìn)棧出棧的過程,先進(jìn)后出
f(2, 7) = f(4, 3) * 2 = (f(16, 1) *4 ) * 2 = ( (f(256, 0) * 16)*4)*2 = 1*16*4*2 = 128
棧結(jié)構(gòu)如下
1
f(256, 0) * 16
f(16, 1) *4
f(4, 3) * 2
f(2, 7)
- 2 回答
- 0 關(guān)注
- 109 瀏覽
添加回答
舉報
0/150
提交
取消