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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

递归初识

發布時間:2023/12/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归初识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是遞歸

所謂遞歸,簡單點來說,就是一個函數直接或間接調用自身的一種方法每調用一次就進入新的一層。它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。遞歸函數必須有結束條件。當函數在一直遞推,直到遇到結束條件后返回,所以遞歸要有兩個要素,結束條件與遞推關系

二、遞歸的簡單應用

?第一個人的年齡為十歲,第二個人的年齡比第一個人年齡大兩歲,以此類推,求第五個人的年齡;

#include <stdio.h> int Age(int n) {if(n==1)//第一個人的年齡{return 10;}else{return Age(n-1)+2;//遞歸過程,自己調用自己,終止條件n=1} } int main() {printf("%d\n",Age(5));return 0; }

三、遞歸與棧的關系

遞歸在棧上開辟空間,棧的空間大約1M左右。

常常聽到 “遞歸的過程就是出入棧的過程”,這句話怎么理解?我們以上述代碼為例,取?n=5,則過程如下:

  • 當n=5時,Age(5)調用了Age(4),Age(4)又接著調用Age(3),Age(3)又接著調用Age(2),Age(2)又接著調用Age(1),直到遇到Age(1)結束,這個過程都是入棧;
  • 因 1 是遞歸結束條件,故不再入棧,此時棧高度為5,也就是所謂的遞歸深度;
  • Age(1)做完,出棧,而Age(1)做完意味著Age(2)也做完,同樣進行出棧,重復下去,直到所有的都出棧完畢,遞歸結束。

如下圖:

四、遞歸總結

1、當函數自己調用自己時,系統將自動把函數中當前的變量和形參暫時保留起來,在新一輪的調用過程中,系統為新調用的函數所用到的變量和形參開辟另外的存 儲單元(內存空間)。每次調用函數所使用的變量在不同的內存空間。

2、遞歸調用的層次越多,同名變量的占用的存儲單元也就越多。一定要記住,每次函數的調用,系統都會為該函數的變量開辟新的內存空間。

3、當本次調用的函數運行結束時,系統將釋放本次調用時所占用的內存空間。程序的流程返回到上一層的調用點,同時取得當初進入該層時,函數中的變量和形參 所占用的內存空間的數據。

4、所有遞歸問題都可以用非遞歸的方法來解決,但對于一些比較復雜的遞歸問題用非遞歸的方法往往使程序變得十分復雜難以讀懂,而函數的遞歸調用在解決這類 問題時能使程序簡潔明了有較好的可讀性;但由于遞歸調用過程中,系統要為每一層調用中的變量開辟內存空間、要記住每一層調用后的返回點、要增加許多額外的 開銷,因此函數的遞歸調用通常會降低程序的運行效率。

遞歸的優點:代碼簡潔,可讀性高。

遞歸的缺點:一般情況下空間復雜度較高,運行效率降低。

?

  

  

  

  

?

?

?

?

總結

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

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