国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 系統(tǒng)教程 操作系統(tǒng) 軟件開發(fā)之遞歸操作

軟件開發(fā)之遞歸操作

Aug 16, 2024 pm 07:54 PM
linux linux教程 紅帽 linux系統(tǒng) linux命令 linux認(rèn)證 紅帽linux linux視頻

軟件開發(fā)之遞歸操作

我們來看一下這個經(jīng)典的遞歸階乘:

#include
int factorial(int n)
{
int previous = 0xdeadbeef;
if (n == 0 || n == 1) {
return 1;
}
previous = factorial(n-1);
return n * previous;
}
int main(int argc)
{
int answer = factorial(5);
printf("%d\n", answer);
}

遞歸階乘 - factorial.c
函數(shù)調(diào)用自身的這個觀點在一開始是讓人很難理解的。為了讓這個過程更形象具體,下圖展示的是當(dāng)調(diào)用 factorial(5) 并且達(dá)到 n == 1這行代碼 時,棧上 端點的情況:

軟件開發(fā)之遞歸操作

每次調(diào)用 factorial 都生成一個新的 棧幀。這些棧幀的創(chuàng)建和 銷毀 是使得遞歸版本的階乘慢于其相應(yīng)的迭代版本的原因。在調(diào)用返回之前,累積的這些棧幀可能會耗盡??臻g,進(jìn)而使你的程序崩潰。

而這些擔(dān)心經(jīng)常是存在于理論上的。例如,對于每個 factorial 的棧幀占用 16 字節(jié)(這可能取決于棧排列以及其它因素)。如果在你的電腦上運行著現(xiàn)代的 x86 的 Linux 內(nèi)核,一般情況下你擁有 8 GB 的棧空間,因此,factorial 程序中的 n 最多可以達(dá)到 512,000 左右。這是一個 巨大無比的結(jié)果,它將花費 8,971,833 比特來表示這個結(jié)果,因此,??臻g根本就不是什么問題:一個極小的整數(shù) —— 甚至是一個 64 位的整數(shù) —— 在我們的棧空間被耗盡之前就早已經(jīng)溢出了成千上萬次了。

過一會兒我們再去看 CPU 的使用,現(xiàn)在,我們先從比特和字節(jié)回退一步,把遞歸看作一種通用技術(shù)。我們的階乘算法可歸結(jié)為:將整數(shù) N、N-1、 … 1 推入到一個棧,然后將它們按相反的順序相乘。實際上我們使用了程序調(diào)用棧來實現(xiàn)這一點,這是它的細(xì)節(jié):我們在堆上分配一個棧并使用它。雖然調(diào)用棧具有特殊的特性,但是它也只是又一種數(shù)據(jù)結(jié)構(gòu)而已,你可以隨意使用。我希望這個示意圖可以讓你明白這一點。

當(dāng)你將棧調(diào)用視為一種數(shù)據(jù)結(jié)構(gòu),有些事情將變得更加清晰明了:將那些整數(shù)堆積起來,然后再將它們相乘,這并不是一個好的想法。那是一種有缺陷的實現(xiàn):就像你拿螺絲刀去釘釘子一樣。相對更合理的是使用一個迭代過程去計算階乘。

但是,螺絲釘太多了,我們只能挑一個。有一個經(jīng)典的面試題,在迷宮里有一只老鼠,你必須幫助這只老鼠找到一個奶酪。假設(shè)老鼠能夠在迷宮中向左或者向右轉(zhuǎn)彎。你該怎么去建模來解決這個問題?

就像現(xiàn)實生活中的很多問題一樣,你可以將這個老鼠找奶酪的問題簡化為一個圖,一個二叉樹的每個結(jié)點代表在迷宮中的一個位置。然后你可以讓老鼠在任何可能的地方都左轉(zhuǎn),而當(dāng)它進(jìn)入一個死胡同時,再回溯回去,再右轉(zhuǎn)。這是一個老鼠行走的 迷宮示例:

軟件開發(fā)之遞歸操作

每到邊緣(線)都讓老鼠左轉(zhuǎn)或者右轉(zhuǎn)來到達(dá)一個新的位置。如果向哪邊轉(zhuǎn)都被攔住,說明相關(guān)的邊緣不存在?,F(xiàn)在,我們來討論一下!這個過程無論你是調(diào)用棧還是其它數(shù)據(jù)結(jié)構(gòu),它都離不開一個遞歸的過程。而使用調(diào)用棧是非常容易的:

#include
#include "maze.h"
int explore(maze_t *node)
{
int found = 0;
if (node == NULL)
{
return 0;
}
if (node->hasCheese){
return 1;// found cheese
}
found = explore(node->left) || explore(node->right);
return found;
}
int main(int argc)
{
int found = explore(&maze);
}

遞歸迷宮求解 下載
當(dāng)我們在 maze.c:13 中找到奶酪時,棧的情況如下圖所示。你也可以在 GDB 輸出 中看到更詳細(xì)的數(shù)據(jù),它是使用 命令 采集的數(shù)據(jù)。

軟件開發(fā)之遞歸操作

它展示了遞歸的良好表現(xiàn),因為這是一個適合使用遞歸的問題。而且這并不奇怪:當(dāng)涉及到算法時,遞歸是規(guī)則,而不是例外。它出現(xiàn)在如下情景中——進(jìn)行搜索時、進(jìn)行遍歷樹和其它數(shù)據(jù)結(jié)構(gòu)時、進(jìn)行解析時、需要排序時——它無處不在。正如眾所周知的 pi 或者 e,它們在數(shù)學(xué)中像“神”一樣的存在,因為它們是宇宙萬物的基礎(chǔ),而遞歸也和它們一樣:只是它存在于計算結(jié)構(gòu)中。

Steven Skienna 的優(yōu)秀著作 算法設(shè)計指南 的精彩之處在于,他通過 “戰(zhàn)爭故事” 作為手段來詮釋工作,以此來展示解決現(xiàn)實世界中的問題背后的算法。這是我所知道的拓展你的算法知識的最佳資源。另一個讀物是 McCarthy 的 關(guān)于 LISP 實現(xiàn)的的原創(chuàng)論文。遞歸在語言中既是它的名字也是它的基本原理。這篇論文既可讀又有趣,在工作中能看到大師的作品是件讓人興奮的事情。

Berbalik kepada masalah maze. Walaupun sukar untuk meninggalkan rekursi di sini, ini tidak bermakna ia mesti dicapai melalui timbunan panggilan. Anda boleh menggunakan rentetan seperti RRLL untuk menjejak belokan, dan kemudian gunakan rentetan ini untuk menentukan langkah seterusnya tetikus. Atau anda boleh menetapkan sesuatu yang lain untuk merekodkan keseluruhan status pencarian keju. Anda masih melaksanakan proses rekursif, anda hanya perlu melaksanakan struktur data anda sendiri.

Nampaknya lebih rumit kerana panggilan tindanan adalah lebih sesuai. Setiap bingkai tindanan merekodkan bukan sahaja nod semasa, tetapi juga keadaan pengiraan pada nod tersebut (dalam kes ini, sama ada kita hanya membiarkannya pergi ke kiri, atau telah cuba pergi ke kanan). Oleh itu, kod itu menjadi tidak penting. Walau bagaimanapun, kadangkala kami meninggalkan algoritma yang sangat baik ini kerana takut limpahan dan prestasi yang dijangkakan. Itu bodoh!

Seperti yang kita lihat, ruang tindanan adalah sangat besar, dan batasan lain sering ditemui sebelum ruang tindanan habis. Di satu pihak, anda boleh menyemak saiz masalah untuk memastikan ia boleh dikendalikan dengan selamat. Kebimbangan CPU didorong oleh dua contoh bermasalah yang diedarkan secara meluas: faktorial bodoh dan rekursi Fibonacci O(2n) tanpa ingatan yang mengerikan. Ia bukan perwakilan yang betul bagi algoritma rekursif tindanan.

Malah operasi tindanan adalah sangat pantas. Biasanya, timbunan mengimbangi kepada data adalah sangat tepat, ia adalah data panas dalam cache, dan arahan khusus beroperasi padanya. Pada masa yang sama, overhed yang dikaitkan dengan menggunakan struktur data anda sendiri yang diperuntukkan pada timbunan adalah penting. Ia sering dilihat bahawa orang menulis kaedah pelaksanaan yang lebih kompleks dan mempunyai prestasi yang lebih buruk daripada rekursi panggilan tindanan. Akhir sekali, prestasi CPU moden adalah sangat baik, dan secara amnya CPU tidak akan menjadi hambatan prestasi. Berhati-hati apabila mempertimbangkan untuk mengorbankan kesederhanaan program, sama seperti anda sentiasa mempertimbangkan prestasi program dan pengukuran prestasi itu.

Artikel seterusnya akan menjadi yang terakhir dalam siri Exploring Stack Kami akan mempelajari tentang panggilan ekor, penutupan dan konsep lain yang berkaitan. Kemudian, tiba masanya untuk menyelami rakan lama kita, kernel Linux. Terima kasih kerana membaca!

軟件開發(fā)之遞歸操作

以上是軟件開發(fā)之遞歸操作的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

CentOS上Postman集成應(yīng)用 CentOS上Postman集成應(yīng)用 May 19, 2025 pm 08:00 PM

在CentOS上集成Postman應(yīng)用可以通過多種方法來實現(xiàn),以下是詳細(xì)的步驟和建議:通過下載安裝包安裝Postman下載Postman的Linux版本安裝包:訪問Postman官方網(wǎng)站,選擇適用于Linux的版本進(jìn)行下載。解壓安裝包:使用以下命令將安裝包解壓到指定目錄,例如/opt:sudotar-xzfpostman-linux-x64-xx.xx.xx.tar.gz-C/opt請注意將“postman-linux-x64-xx.xx.xx.tar.gz”替換為您實際下載的文件名。創(chuàng)建符號

用java編程和其他語言的區(qū)別 Java的跨平臺特性優(yōu)勢分析 用java編程和其他語言的區(qū)別 Java的跨平臺特性優(yōu)勢分析 May 20, 2025 pm 08:21 PM

Java與其他編程語言的主要區(qū)別在于其“一次編寫,到處運行”的跨平臺特性。1.Java的語法接近C ,但去掉了容易出錯的指針操作,適合大型企業(yè)應(yīng)用。2.與Python相比,Java在性能和大規(guī)模數(shù)據(jù)處理上更具優(yōu)勢。Java的跨平臺優(yōu)勢源于Java虛擬機(JVM),它能在不同平臺上運行相同的字節(jié)碼,簡化開發(fā)和部署,但需注意避免使用平臺特定API以保持跨平臺性。

pycharm解釋器在哪里 解釋器位置查找方法 pycharm解釋器在哪里 解釋器位置查找方法 May 23, 2025 pm 10:09 PM

在PyCharm中設(shè)置解釋器的位置可以通過以下步驟實現(xiàn):1.打開PyCharm,點擊“File”菜單,選擇“Settings”或“Preferences”。2.找到并點擊“Project:[你的項目名]”,然后選擇“PythonInterpreter”。3.點擊“AddInterpreter”,選擇“SystemInterpreter”,瀏覽到Python安裝目錄,選中Python可執(zhí)行文件,點擊“OK”。設(shè)置解釋器時需注意路徑正確性、版本兼容性和虛擬環(huán)境的使用,以確保項目順利運行。

如何在VSCode中手動安裝插件包 如何在VSCode中手動安裝插件包 May 15, 2025 pm 09:33 PM

在VSCode中手動安裝插件包的步驟是:1.下載插件的.vsix文件;2.打開VSCode并按Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)調(diào)出命令面板;3.輸入并選擇Extensions:InstallfromVSIX...,然后選擇.vsix文件并安裝。手動安裝插件提供了一種靈活的安裝方式,特別是在網(wǎng)絡(luò)受限或插件市場不可用時,但需要注意文件安全和可能的依賴問題。

Linux各目錄及每個目錄的詳細(xì)介紹(轉(zhuǎn)載) Linux各目錄及每個目錄的詳細(xì)介紹(轉(zhuǎn)載) May 22, 2025 pm 07:54 PM

【常見目錄說明】目錄/bin存放二進(jìn)制可執(zhí)行文件(ls,cat,mkdir等),常用命令一般都在這里。/etc存放系統(tǒng)管理和配置文件/home存放所有用戶文件的根目錄,是用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示/usr用于存放系統(tǒng)應(yīng)用程序,比較重要的目錄/usr/local?本地系統(tǒng)管理員軟件安裝目錄(安裝系統(tǒng)級的應(yīng)用)。這是最龐大的目錄,要用到的應(yīng)用程序和文件幾乎都在這個目錄。/usr/x11r6?存放x?window的目錄/usr/bin?眾多

安裝Nginx后配置文件路徑及初始設(shè)置 安裝Nginx后配置文件路徑及初始設(shè)置 May 16, 2025 pm 10:54 PM

了解Nginx的配置文件路徑和初始設(shè)置非常重要,因為它是優(yōu)化和管理Web服務(wù)器的第一步。1)配置文件路徑通常是/etc/nginx/nginx.conf,使用nginx-t命令可以查找并測試語法。2)初始設(shè)置包括全局設(shè)置(如user、worker_processes)和HTTP設(shè)置(如include、log_format),這些設(shè)置允許根據(jù)需求進(jìn)行定制和擴(kuò)展,錯誤配置可能導(dǎo)致性能問題和安全漏洞。

mysql安裝教程 手把手教你mysql安裝配置詳細(xì)步驟 mysql安裝教程 手把手教你mysql安裝配置詳細(xì)步驟 May 23, 2025 am 06:09 AM

MySQL的安裝和配置可以通過以下步驟完成:1.從官方網(wǎng)站下載適合操作系統(tǒng)的安裝包。2.運行安裝程序,選擇“開發(fā)者默認(rèn)”選項并設(shè)置root用戶密碼。3.安裝后配置環(huán)境變量,確保MySQL的bin目錄在PATH中。4.創(chuàng)建用戶時遵循最小權(quán)限原則并設(shè)置強密碼。5.優(yōu)化性能時調(diào)整innodb_buffer_pool_size和max_connections參數(shù)。6.定期備份數(shù)據(jù)庫并優(yōu)化查詢語句以提高性能。

Informix與MySQL在Linux上的比較 Informix與MySQL在Linux上的比較 May 29, 2025 pm 11:21 PM

Informix和MySQL均為廣受青睞的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它們在Linux環(huán)境下均表現(xiàn)優(yōu)異并得到廣泛應(yīng)用。以下是對兩者在Linux平臺上的對比分析:安裝與配置Informix:在Linux上部署Informix需要下載對應(yīng)的安裝文件,隨后依據(jù)官方文檔指引完成安裝及配置流程。MySQL:MySQL的安裝過程較為簡便,可通過系統(tǒng)的包管理工具(例如apt或yum)輕松實現(xiàn)安裝,并且網(wǎng)絡(luò)上有大量的教程和社區(qū)支持可供參考。性能表現(xiàn)Informix:Informix以卓越的性能和

See all articles