日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归函数中局部变量和全局变量

發布時間:2023/12/4 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归函数中局部变量和全局变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候會因為不注意遞歸函數中局部變量和全局變量,而導致結果和我們期望的不一致,遞歸中,在遞歸中的局部變量和全局變量,可以類似的看成函數調用時傳遞方式的按值傳遞(局部變量)和引用傳遞(全局變量)
局部變量:可以看成兩個值,即雖然名字相同,但每次遞歸時是重新創建的變量,不會覆蓋掉上次創建的值;(類似形參與實參不同)
全局變量:每一次對于全局變量進行操作,就會改變它的值。
看下面兩個簡單的程序,看它們的運行結果

程序一:

#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依然是*,以此推下去。因此,程序會輸出****。

總結

以上是生活随笔為你收集整理的递归函数中局部变量和全局变量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。