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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JS递归算法经典案例与分析

發(fā)布時(shí)間:2023/12/10 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS递归算法经典案例与分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是遞歸函數(shù)?

簡(jiǎn)單定義:當(dāng)函數(shù)直接或者間接調(diào)用自己時(shí),則發(fā)生了遞歸.” 說(shuō)起來(lái)簡(jiǎn)單, 但是理解起來(lái)復(fù)雜, 因?yàn)檫f歸并不直觀, 也不符合我們的思維習(xí)慣, 相對(duì)于遞歸, 我們更加容易理解迭代. 因?yàn)槲覀內(nèi)粘I钪械乃季S方式就是一步接一步的, 并且能夠理解一件事情做了N遍這個(gè)概念. 而我們?nèi)粘I钪袔缀醪粫?huì)有遞歸思維的出現(xiàn).

舉個(gè)簡(jiǎn)單的例子:
求1到5的累加和 下面是傳統(tǒng)的方式, 我們一般都這樣通過(guò)迭代來(lái)計(jì)算累加和, 也很好理解.


而事實(shí)上, 我們也可以通過(guò)遞歸來(lái)完成這樣的任務(wù).

只不過(guò), 我們都不這么做罷了, 雖然這樣的實(shí)現(xiàn)有的時(shí)候可能代碼更短, 但是很明顯, 從思維上來(lái)說(shuō)更加難以理解一些. 當(dāng)然, 我是說(shuō)假如你不是習(xí)慣于函數(shù)式語(yǔ)言的話. 這個(gè)例子相對(duì)簡(jiǎn)單, 稍微看一下還是能明白吧.

作為這么簡(jiǎn)單的例子, 兩種算法其實(shí)大同小異, 雖然我們習(xí)慣迭代, 但是, 也能看到, 遞歸的算法無(wú)論是從描述上還是實(shí)際實(shí)現(xiàn)上, 并不比迭代要麻煩.

理解遞歸

在初學(xué)遞歸的時(shí)候, 看到一個(gè)遞歸實(shí)現(xiàn), 我們總是難免陷入不停的回溯驗(yàn)證之中, 因?yàn)榛厮菥拖穹催^(guò)來(lái)思考迭代, 這是我們習(xí)慣的思維方式, 但是實(shí)際上遞歸不需要這樣來(lái)驗(yàn)證.
要實(shí)現(xiàn)遞歸要書寫兩個(gè)內(nèi)容:
一個(gè)是滿足結(jié)束條件的時(shí)候結(jié)束函數(shù)
一個(gè)是不滿足結(jié)束條件的時(shí)候要執(zhí)行的代碼

我們拿上面案例來(lái)作為分析:
1.我要書寫一個(gè)函數(shù)叫做add
2.這個(gè)函數(shù)有形參n,調(diào)用的時(shí)候:add(n)
3.我這個(gè)add函數(shù)的功能是計(jì)算任意一個(gè)數(shù)1到n的累加和。
這里以n=5來(lái)分析

分析思路:

第一遍
計(jì)算輸入的n即n=5;程序開(kāi)始執(zhí)行,
返回的是add( 5 - 1) + 5 的值,即返回的是add(4)+5的值,add(4)的值是多少?
因?yàn)闆](méi)有具體數(shù)值,程序就要去執(zhí)行add(4),即調(diào)用第二遍

第二遍
計(jì)算add(4),程序開(kāi)始執(zhí)行,
返回的是add( 4 - 1) + 4 的值,即返回的是add(3)+4的值,add(3)的值是多少?
因?yàn)闆](méi)有具體數(shù)值,程序就要去執(zhí)行add(3),即調(diào)用第三遍

第三遍
計(jì)算add(3),程序開(kāi)始執(zhí)行,
返回的是add( 3 - 1) + 3 的值,即返回的是add(2)+3的值,add(2)的值是多少?
因?yàn)闆](méi)有具體數(shù)值,程序就要去執(zhí)行add(2),即調(diào)用第四遍

第四遍
計(jì)算add(2),程序開(kāi)始執(zhí)行,
返回的是add( 2 - 1) + 3 的值,即返回的是add(1)+2的值,add(1)的值是多少?
因?yàn)闆](méi)有具體數(shù)值,程序就要去執(zhí)行add(1),即調(diào)用第五遍

第五遍
計(jì)算add(1),程序開(kāi)始執(zhí)行,
當(dāng)n==1 時(shí),滿足第一個(gè)條件,返回的值是1,是一個(gè)具體數(shù)值,此時(shí)函數(shù)不在調(diào)用自身。
看到這里我們就應(yīng)該明白此時(shí)

add(1)=1
add(2)=add(1)+2 =1+2
add(3)=add(2)+3=1+2+3
add(4)=add(3)+4=1+2+3+4
add(5)=add(4)+5=1+2+3+4+5


add(n)=add(n-1)+n=1+2+3+4+5+…+n

注意點(diǎn):使用遞歸時(shí),要有結(jié)束條件,否則就會(huì)“死循環(huán)”,造成瀏覽器崩潰。

使用遞歸

既然遞歸比迭代要難以理解, 為啥我們還需要遞歸呢? 從上面的例子來(lái)看, 自然意義不大, 但是很多東西的確用遞歸思維會(huì)更加簡(jiǎn)單……

經(jīng)典的例子就是斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列、
因數(shù)學(xué)家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,
指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,
斐波那契數(shù)列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3)

有了遞歸的算法, 用程序?qū)崿F(xiàn)實(shí)在再簡(jiǎn)單不過(guò)了:


改為用迭代實(shí)現(xiàn)呢? 你可以試試.

遞歸的問(wèn)題

當(dāng)然, 這個(gè)世界上沒(méi)有啥時(shí)萬(wàn)能的, 遞歸也不例外, 首先遞歸并不一定適用所有情況, 很多情況用迭代遠(yuǎn)遠(yuǎn)比用遞歸好了解, 其次, 相對(duì)來(lái)說(shuō), 遞歸的效率往往要低于迭代的實(shí)現(xiàn), 同時(shí), 內(nèi)存耗用也會(huì)更大, 雖然這個(gè)時(shí)候可以用尾遞歸來(lái)優(yōu)化, 但是尾遞歸并不是一定能簡(jiǎn)單做到.它是依據(jù)數(shù)據(jù)結(jié)構(gòu)的棧的原理,不斷開(kāi)辟新的內(nèi)存空間以滿足程序需要,而不是不斷改變已有內(nèi)存空間的值來(lái)滿足程序需要,所以遞歸是一種極具消耗內(nèi)存資源的算法思維,所以在現(xiàn)實(shí)項(xiàng)目中,除非代碼量影響過(guò)大,否則能不用遞歸就不用遞歸.

參考

精通遞歸程序設(shè)計(jì)

創(chuàng)作不易,點(diǎn)個(gè)贊吧!!

版權(quán)聲明:如無(wú)特殊說(shuō)明,文章均為本站原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
本文鏈接:https://blog.csdn.net/qms888888

總結(jié)

以上是生活随笔為你收集整理的JS递归算法经典案例与分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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