递归函数中局部变量和全局变量
有時候會因為不注意遞歸函數中局部變量和全局變量,而導致結果和我們期望的不一致,遞歸中,在遞歸中的局部變量和全局變量,可以類似的看成函數調用時傳遞方式的按值傳遞(局部變量)和引用傳遞(全局變量)
局部變量:可以看成兩個值,即雖然名字相同,但每次遞歸時是重新創建的變量,不會覆蓋掉上次創建的值;(類似形參與實參不同)
全局變量:每一次對于全局變量進行操作,就會改變它的值。
看下面兩個簡單的程序,看它們的運行結果
程序一:
#include <stdio.h> void f() {char x;scanf("%c",&x);if(x=='*'){printf("%c",x);}else{f();printf("%c",x);}return; } int main() {f();return 0; }輸入樣例
abc*
輸出樣例
*cba
程序2:
#include <stdio.h> char x; void f() {scanf("%c",&x);if(x=='*'){printf("%c",x);}else{f();printf("%c",x);}return; } int main() {f();return 0; }輸入樣例
abc*
輸出樣例
由上面兩個程序可以看出,它們定義的變量是不一樣的,第一個函數的變量x是局部變量,而第二個程序的變量x是全局變量,這就導致了它們的輸出結果不一樣。
分析程序1
上面是進入函數f( )后的運行過程,剛開始輸入x=a,if為假,再次調用f( )函數,再次輸入x=b,以此類推下去,到最后if為真時,輸出x= *,再返回輸出x=c,以此類推下去,最后的到的結果是 *cba。
而由于變量x是局部變量,存放在內存的棧區,屬于動態存儲類別, 占動態存儲區空間,函數調用結束后自動釋放。
如:看上面的流程圖1,當第⑤執行后,則第四個框內的數據都會被系統回收,x的值就看第三個框,變為c,以此下去,直到結束。所以最后的結果并不會跟程序2的結果一樣輸出****。
分析程序2
程序2中的自定義函數f( )與程序1的執行過程差不多,只是變量x變成了全局變量。全局變量存放在內存中的靜態區,在該區的數據只有在程序全部執行完之后才會被釋放。
看上面的流程圖2,x是全局變量,所以x放在了靜態區里面,每次激活函數f( )后,輸入的x的值會覆蓋前一個x的值,當程序執行到第⑤步執行后,x的值并不會像程序1那樣被系統回收,它會保留下來,當函數進入第三個框內的時候,輸出的x依然是*,以此推下去。因此,程序會輸出****。
總結
以上是生活随笔為你收集整理的递归函数中局部变量和全局变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑性皮肤如何来处理电脑如何弄皮肤
- 下一篇: N的阶乘的长度 V2(斯特林近似) 51