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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

牛客网递归错题:递归、欧几里得求最大公约数的时间复杂度、线性递归与尾递归实例区别

發(fā)布時(shí)間:2024/9/30 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网递归错题:递归、欧几里得求最大公约数的时间复杂度、线性递归与尾递归实例区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

很久找不到學(xué)習(xí)的平衡點(diǎn),似乎有目的性的去解決問(wèn)題尋求方法獲得知識(shí)會(huì)比直接吸取知識(shí)要有趣,更印象深刻,這些都是我爬過(guò)的坑,以此銘記在心。

1. 隊(duì)列在程序調(diào)用時(shí)必不可少,因此遞歸離不開(kāi)隊(duì)列?!?/h6>

遞歸是棧實(shí)現(xiàn)的。棧是先進(jìn)后出,也就是上次遞歸調(diào)用的時(shí)候,保存在棧頂。在返回的時(shí)候出棧,所以是遞歸依靠棧實(shí)現(xiàn)的

遞歸的定義:遞歸調(diào)用是一種特殊的嵌套調(diào)用,是某個(gè)函數(shù)調(diào)用自己或者是調(diào)用其他函數(shù)后再次調(diào)用自己的,只要函數(shù)之間互相調(diào)用能產(chǎn)生循環(huán)的則一定是遞歸調(diào)用

遞歸的特點(diǎn):

  • 函數(shù)要直接或間接調(diào)用自身。
  • 要有遞歸終止條件檢查,即遞歸終止的條件被滿足后,則不再調(diào)用自身函數(shù),函數(shù)的調(diào)用原則和數(shù)據(jù)結(jié)構(gòu)棧的實(shí)現(xiàn)是相一致。(類似于不斷壓棧,直到棧滿,作為終止條件)
  • 如果不滿足遞歸終止的條件,則調(diào)用涉及遞歸調(diào)用的表達(dá)式。在調(diào)用函數(shù)自身時(shí),有關(guān)終止條件的參數(shù)要發(fā)生變化,而且需向遞歸終止的方向變化。
2. 以下程序是用來(lái)計(jì)算兩個(gè)非負(fù)數(shù)之間的最大公約數(shù):
long long gcd(long long x, long long y) {if (y == 0)return x;elsereturn gcd(y, x % y); }

我們假設(shè)x,y中最大的那個(gè)數(shù)的長(zhǎng)度為n,基本運(yùn)算時(shí)間復(fù)雜度為O(1),那么該程序的時(shí)間復(fù)雜度為o(log n)

求最大公約數(shù)用的是輾轉(zhuǎn)相除法歐幾里得算法):兩個(gè)整數(shù)的最大公約數(shù)等于其中較小的那個(gè)數(shù)和兩數(shù)相除余數(shù)的最大公約數(shù),所以是O(log n)。最大公約數(shù)還有Stein算法計(jì)算

3. 設(shè)有遞歸算法如下,
int x(int n) {if(n<=3)return 1;elsereturn x(n-2)+x(n-4)+1; }

試問(wèn)計(jì)算x(x(8))時(shí)需要計(jì)算18次x函數(shù)。

根據(jù)題意,易得x(3) = x(2) = x(1) = x(0) = 1
x(8) = x(6) +x(4) +1
= x(4) + x(2) +1 + x(2) + x(0) +1 + 1
= x(2) + x(0) +1 + 1 + 1 +1 + 1 +1 + 1
= 9
x(8) 這個(gè)就調(diào)用了9次函數(shù)x(int n)
同理可得x(9)也是調(diào)用了9次函數(shù)x(int n)

所以總共18次。

4. 4個(gè)圓盤的Hanoi塔,總的移動(dòng)次數(shù)為15

Hanoi 問(wèn)題的理解是:

  • 先把上面n-1個(gè)圓盤移到第二個(gè)柱子上(共f(n-1)步)
  • 再把最后一個(gè)圓盤移到第三個(gè)柱子(共1步)
  • 再把第二柱子上的圓盤移動(dòng)到第三個(gè)柱子上(共f(n-1)步)
    于是得出其遞推方程:f(n)=f(n-1)+1+ f(n-1)=2*f(n-1)+1
5.對(duì)遞歸程序的優(yōu)化的一般的手段為尾遞歸優(yōu)化

常見(jiàn)的優(yōu)化手段有尾遞歸,迭代,循環(huán)

尾遞歸:在每一次遞歸的過(guò)程中保持了上一次計(jì)算的狀態(tài),也就是“線性迭代過(guò)程”

尾遞歸和一般的遞歸不同在對(duì)內(nèi)存的占用,普通遞歸創(chuàng)建stack累積而后計(jì)算收縮,尾遞歸只會(huì)占用恒量的內(nèi)存(和迭代一樣)

舉個(gè)例子,計(jì)算n的階乘

//線性遞歸long Rescuvie(long n) {return (n == 1) ? 1 : n * Rescuvie(n - 1);}//尾遞歸 long TailRescuvie(long n, long a) {return (n == 1) ? a : TailRescuvie(n - 1, a * n);}long TailRescuvie(long n) {//封裝用的return (n == 0) ? 1 : TailRescuvie(n, 1);}

總結(jié)

以上是生活随笔為你收集整理的牛客网递归错题:递归、欧几里得求最大公约数的时间复杂度、线性递归与尾递归实例区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。