国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深入理解遞歸算法,被誤解的遞歸

開發(fā) 后端 算法
遞歸是一個(gè)神奇的算法,它是編程書籍中講解的最尷尬部分。這些書籍通常會(huì)展示一個(gè)遞歸的階乘實(shí)現(xiàn),然后警告你,雖然它能運(yùn)行但是它非常的慢并且可能會(huì)堆棧溢出而崩潰。雖然大家對(duì)它持懷疑態(tài)度,但是這不影響遞歸是算法中最強(qiáng)大的想法。

[[333118]]

遞歸是一個(gè)神奇的算法,它是編程書籍中講解的最尷尬部分。這些書籍通常會(huì)展示一個(gè)遞歸的階乘實(shí)現(xiàn),然后警告你,雖然它能運(yùn)行但是它非常的慢并且可能會(huì)堆棧溢出而崩潰。雖然大家對(duì)它持懷疑態(tài)度,但是這不影響遞歸是算法中最強(qiáng)大的想法。

讓我們來(lái)看看經(jīng)典的遞歸階乘:

factorial.c

  1. #include <stdio.h> 
  2. int factorial(int n) 
  3.  int previous = 0xdeadbeef; 
  4.  if (n == 0 || n == 1) { 
  5.  return 1; 
  6.  } 
  7.  previous = factorial(n-1); 
  8.  return n * previous; 
  9. int main(int argc) 
  10.  int answer = factorial(5); 
  11.  printf("%d\n", answer); 
  12.   

一個(gè)函數(shù)調(diào)用自身的想法起初非常神秘。為了解釋整個(gè)過(guò)程,下圖展示了factorial(5)被調(diào)用到n == 1 棧上結(jié)構(gòu)。

 

深入理解遞歸算法,被誤解的遞歸

 

每次調(diào)用factorial都會(huì)生成一個(gè)新的棧幀。這些棧幀的創(chuàng)建和銷毀使得遞歸因子比其迭代部分慢。在調(diào)用開始和返回之前的這些棧幀累積是可能耗盡棧空間并使程序崩潰。

但是這些擔(dān)憂通常是理論上的。例如,棧幀 factorial每個(gè)占用16個(gè)字節(jié)(這可以根據(jù)棧對(duì)齊和其他因素而變化)。如果您在計(jì)算機(jī)上運(yùn)行現(xiàn)代x86 Linux內(nèi)核,通常默認(rèn)有8兆字節(jié)的堆棧空間,因此factorial n最多可以處理512,000。這是一個(gè)巨大數(shù),需要8,971,833位來(lái)表示這個(gè)數(shù),所以棧空間是我們問(wèn)題中最少的:一個(gè)微弱的整數(shù) - 甚至是64位 - 在我們用完棧空間之前會(huì)溢出數(shù)萬(wàn)次。

我們稍后會(huì)看一下CPU的使用情況,但是現(xiàn)在讓我們從位和字節(jié)中退一步,看看遞歸作為一種通用技術(shù)。我們的階乘算法歸結(jié)為將整數(shù)N,N-1,... 1推入堆棧,然后以相反的順序?qū)⑺鼈兿喑恕N覀兪褂贸绦虻恼{(diào)用堆棧執(zhí)行此操作的前提是:我們可以在堆上分配堆棧并使用它。雖然調(diào)用堆棧確實(shí)具有特殊屬性,但它只是您可以使用的另一種數(shù)據(jù)結(jié)構(gòu)。

一旦你看到調(diào)用堆棧作為一個(gè)數(shù)據(jù)結(jié)構(gòu),其他東西就變得豁然開朗了:將本身之前所有這些整數(shù)累加起來(lái)再乘以自身這顯然不是明智的選擇。 使用迭代過(guò)程計(jì)算階乘更為明智。

有一個(gè)傳統(tǒng)的面試問(wèn)題,在迷宮中放一只老鼠,你幫助老鼠找奶酪,假設(shè)老鼠可以在迷宮中向左或向右轉(zhuǎn)。你會(huì)如何建模并解決這個(gè)問(wèn)題?

像生活中的大多數(shù)問(wèn)題一樣,你可以將這種嚙齒動(dòng)物的任務(wù)抽象到一個(gè)圖形,特別是一個(gè)二叉樹,其中節(jié)點(diǎn)代表迷宮中的位置。然后你可以盡可能地讓鼠標(biāo)左轉(zhuǎn),當(dāng)它到達(dá)死胡同時(shí)回溯然后右轉(zhuǎn)。下圖就是老鼠路徑 :

 

深入理解遞歸算法,被誤解的遞歸

 

每條邊(線)都可以左轉(zhuǎn)或右轉(zhuǎn),老鼠可以選擇。如果任一轉(zhuǎn)彎被阻止,則相應(yīng)的邊緣不存在。無(wú)論您使用調(diào)用堆棧還是其他數(shù)據(jù)結(jié)構(gòu),此過(guò)程本質(zhì)上都是遞歸的。但使用調(diào)用棧非常簡(jiǎn)單:

Maze.c

  1. #include <stdio.h> 
  2. #include "maze.h" 
  3. int explore(maze_t *node) 
  4.  int found = 0; 
  5.  if (node == NULL) { 
  6.  return 0; 
  7.  } 
  8.  if (node->hasCheese) { 
  9.  return 1; // found cheese 
  10.  } 
  11.  found = explore(node->left) || explore(node->right); 
  12.  return found; 
  13. int main(int argc) 
  14.  int found = explore(&maze); 

在maze.c:13中找到奶酪,下圖是堆棧。

 

深入理解遞歸算法,被誤解的遞歸

 

雖然這里很難擺脫遞歸,但這并不意味著它必須通過(guò)調(diào)用棧來(lái)完成。例如,你可以使用一個(gè)字符串 RRLL來(lái)跟蹤轉(zhuǎn)彎,并依靠字符串來(lái)決定鼠標(biāo)的下一步行動(dòng)。或者你可以分配其他變量來(lái)記錄奶酪尋找的狀態(tài)。你仍然在實(shí)現(xiàn)遞歸過(guò)程,但滾動(dòng)你自己的數(shù)據(jù)結(jié)構(gòu)。

這可能會(huì)更復(fù)雜,因?yàn)檎{(diào)用堆棧就像手套一樣。每個(gè)堆棧幀不僅記錄當(dāng)前節(jié)點(diǎn),還記錄該節(jié)點(diǎn)中的計(jì)算狀態(tài)(在這種情況下,我們是僅采用左側(cè)還是已經(jīng)嘗試右側(cè))。然而,我們有時(shí)會(huì)因?yàn)楹ε乱绯龆艞壛嗣篮玫臇|西。在我看來(lái)是非常愚蠢的。

正如我們所看到的,棧很大,并且在棧空間之前經(jīng)常會(huì)遇到其他約束。還可以檢查問(wèn)題的大小并確保可以安全地處理。CPU擔(dān)心主要是由兩個(gè)廣泛的病理學(xué)例子灌輸:愚蠢的因子和可靠的O(2 n) 遞歸Fibonacci沒(méi)有記憶。這些并不表示理智的堆棧遞歸算法。

現(xiàn)實(shí)情況是棧操作很快。數(shù)據(jù)的偏移是準(zhǔn)確的,棧在緩存中,不需要冷啟動(dòng),并且有專門的指令來(lái)完成工作。同時(shí),使用您自己的堆分配數(shù)據(jù)結(jié)構(gòu)會(huì)產(chǎn)生大量開銷。會(huì)看到其他人編寫的東西比調(diào)用堆棧遞歸更復(fù)雜,性能更差。

現(xiàn)代CPU 非常優(yōu)秀了,通常不是瓶頸。簡(jiǎn)單往往和性能等同。

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2019-09-18 10:12:37

遞歸數(shù)據(jù)結(jié)構(gòu)

2019-09-16 08:32:59

遞歸算法編程

2023-10-08 08:53:36

數(shù)據(jù)庫(kù)MySQL算法

2009-09-02 18:39:34

C#遞歸算法

2017-07-26 15:59:51

尋路算法Dijkstra游戲

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2010-06-01 15:25:27

JavaCLASSPATH

2022-03-18 06:32:43

遞歸Python算法

2012-11-22 10:11:16

LispLisp教程

2009-11-17 16:53:24

PHP遞歸算法

2025-06-05 05:51:33

2020-09-23 10:00:26

Redis數(shù)據(jù)庫(kù)命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運(yùn)維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2024-02-21 21:14:20

編程語(yǔ)言開發(fā)Golang

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久偷看各类wc女厕嘘嘘偷窃 | 久久精品人人爽人人爽| 欧美一区二区三区白人| 9l视频自拍9l视频自拍| 宅男噜噜噜66国产日韩在线观看| 欧美高清自拍一区| 男女免费观看在线爽爽爽视频| 欧美性三三影院| 男人的天堂成人| 婷婷综合在线| 欧美理论片在线观看| 黄页在线观看视频| 日韩激情免费| 欧美吞精做爰啪啪高潮| 欧美日韩最好看的视频| 成人伊人222| 欧美日韩国产成人精品| 亚洲福利在线视频| 国产精品欧美一区二区三区奶水| 男女啪啪免费视频网站| 国产日产一区二区| 亚洲xxx拳头交| 欧美一区二区成人6969| 三年中国国语在线播放免费| 日韩在线短视频| 亚洲变态欧美另类捆绑| 中文字幕av不卡在线| 日韩午夜av| 欧美精品www| 一个人www视频在线免费观看| 91在线小视频| 国产精品av电影| 欧美成熟毛茸茸| 国产综合自拍| 亚洲网在线观看| 欧美成人综合一区| 91大神影片| 久久综合色婷婷| 在线观看成人一级片| 亚洲伦理在线精品| 日本精品va在线观看| 奇米成人av国产一区二区三区| 麻豆mv在线看| 黄色成人av在线| 亚洲久久中文字幕| 久久久久国产精品麻豆| 亚洲精品乱码久久久久久蜜桃91 | 欧美日韩在线直播| 欧美变态xxxx| 亚洲一区影音先锋| 在线视频网站| 少女频道在线观看免费播放电视剧| 亚洲午夜精品在线| 麻豆蜜桃91| 久久精品国产福利| 国产尤物一区二区| 丁香花在线影院| 国产精品理伦片| 久久久久久九九九九| 精品国产一区二区三区成人影院| 99久久99久久免费精品蜜臀| 999久久久| 国产美女情趣调教h一区二区| 亚洲欧美日韩国产手机在线 | 不卡在线一区二区| 日韩资源在线观看| 国产精品毛片一区二区三区四区| 综合久久综合久久| 蜜臀av色欲a片无码精品一区 | 97久久久精品综合88久久| 日本五十路在线| 中文字幕精品综合| 91久久亚洲| 欧美在线se| 欧美日韩成人在线观看| 91精品啪在线观看国产18| 国产原创popny丨九色| 国产成+人+日韩+欧美+亚洲| 久久婷婷五月综合色国产香蕉| 亚洲人成五月天| 美女扒开腿让男人桶爽久久软| 国产精品久久一区| 国产亚洲欧美日韩俺去了| 男女高潮又爽又黄又无遮挡| 欧美日韩国产电影| 日韩二区三区四区| 成人国产在线看| 高清欧美精品xxxxx| 97se亚洲国产综合自在线| 成人黄色网页| 欧美久久一二三四区| 久久精品嫩草影院| 国产成人久久久精品一区| 亚洲三级电影在线观看| 岛国大片在线播放| 欧美日韩美女视频| 三妻四妾完整版在线观看电视剧| 色阁综合av| 日韩av电影手机在线| 色97色成人| av中文字幕av| 亚洲精品写真福利| 国产黄大片在线观看画质优化| 欧美1区2区| 国产在线激情| 亚洲综合偷拍欧美一区色| av在线1区2区| 美乳少妇欧美精品| 亚洲精选91| 国产一区二区在线免费播放| 欧美视频一区在线| 国产欧美视频在线| 欧美少妇一区| 中文字幕中文字幕中文字幕亚洲无线 | 亚洲成人av在线| jazzjazz国产精品麻豆| 精品毛片久久久久久| 国产精品久久久久久久久搜平片 | 欧美日韩福利| 美女一区二区三区视频| 日韩一区二区在线免费观看| 天堂俺去俺来也www久久婷婷 | 免费h精品视频在线播放| 国产精品麻豆久久久| 蜜桃视频www网站在线观看| 国产欧美精品日韩| 久久久91精品国产一区二区三区| sqte在线播放| 精品无人区一区二区三区竹菊| 亚洲激情图片小说视频| 日本午夜一区二区三区| 色狠狠色噜噜噜综合网| 99国产成+人+综合+亚洲欧美| 黄色a级在线观看| 国产一区av在线| av在线播放网| 69**夜色精品国产69乱| 狠狠v欧美v日韩v亚洲ⅴ| 精品视频一二三| 欧美在线影院在线视频| av电影在线观看完整版一区二区| 国产精品剧情| 国产精品一区二区不卡视频| 亚洲国产一区二区视频| 粉嫩的18在线观看极品精品| h无码动漫在线观看| 精品剧情在线观看| 久久亚洲影视婷婷| 欧美一区二区三区在线观看视频| 51久久精品夜色国产麻豆| 黄色片网址在线观看| 一级毛片视频在线观看| 日韩a在线播放| 色播亚洲婷婷| 97视频资源在线观看| 欧美r级在线观看| 日韩精品一区二| 日韩久久午夜影院| 精品久久久久久无| 伊人久久精品视频| 日韩精品五月天| 日本片在线观看| 亚洲视频三区| 麻豆一区二区在线| 懂色av一区二区三区| 日韩免费高清视频| 91国产中文字幕| 自拍日韩亚洲一区在线| 欧美捆绑视频| 蜜桃成人av| 97久久超碰国产精品| 日韩一级二级三级精品视频| 91久久精品久久国产性色也91| 丰满女人性猛交| 99免费精品在线| 国产成人在线视频播放| 欧美午夜无遮挡| 国产精品久久久久77777| 欧美在线视频二区| 日韩精品一二三四| 日韩一区二区在线观看视频播放| 国产成人极品视频| 国产精品av免费| 日本高清网站| 成人自拍av| 国产亚洲精品美女久久久久久久久久| 综合国产在线| 国产精品一区一区| 7777精品伊人久久久大香线蕉的 | 日韩三级视频中文字幕| 91精品国产全国免费观看| 欧美日韩国产高清一区二区三区| 色婷婷精品大视频在线蜜桃视频| 成人福利在线看| 日韩一区中文字幕| 亚洲蜜桃在线| 黑人久久a级毛片免费观看| 亚洲成人久久网| 激情视频免费观看在线| 99免费精品视频|