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

Javascript函數之深入淺出遞歸思想,附案例與代碼!

開發 前端
“遞歸”在生活中的一個典例就是“問路”。如圖小哥哥進入電影院后找不到自己的座位,問身邊的小姐姐“這是第幾排”,小姐姐也不清楚便依次向前詢問,問至第一排的觀眾后依次向后反饋結果,“我是第一排”,“我是第二排”,···,最終確定自己座位所在排數。

[[317905]]

 一.遞歸函數的理解

1、生活中的遞歸

 

“遞歸”在生活中的一個典例就是“問路”。如圖小哥哥進入電影院后找不到自己的座位,問身邊的小姐姐“這是第幾排”,小姐姐也不清楚便依次向前詢問,問至第一排的觀眾后依次向后反饋結果,“我是第一排”,“我是第二排”,···,最終確定自己座位所在排數。

在這個過程中充分反應了“傳遞”(詢問)和“回歸”(反饋)的思想,故將這種現象稱為“遞歸”。

2、編程中的遞歸

計算機有兩個特點:“很笨”又“很快”。所以將“復雜問題”轉化為“多步驟的簡單問題”后,計算機才能高效執行。

而遞歸是編程算法的一種,通過調用自身,將一些復雜的問題簡單化,便于得出解決方案。

下面通過簡單的案例了解編程中的遞歸

案例:計算1+2+3+4+5+6的和。

 

  1. function fn(n){ 
  2.     if(n === 1){ 
  3.         return 1; 
  4.     } 
  5.     return n + fn(n - 1); 
  6. fn(6); 

計算過程:f(6) = 6 + f(5)

f(6) = 6 + 5 + f(4)

f(6) = 6 + 5 + 4 + f(3)

f(6) = 6 + 5 + 4 + 3 + f(2)

f(6) = 6 + 5 + 4 + 3 + 2 + f(1)

f(6) = 6 + 5 + 4 + 3 + 2 + 1

由上可知遞歸函數的本質:

  • 調用自身

遞歸函數的實現有兩個要素:

  1. 終止條件
  2. 逐步靠近終止條件

案例中的終止條件是:當 n === 1 時,fn(1) === 1。若沒有終止條件,函數會繼續計算f(0) 、f(-1) 、f(-2) ··· 從而進入死循環,無法得出結果。

通過計算過程可以看出,函數依次計算f(6)、f(5)、f(4)、f(3)、 f(2)、f(1),很好的滿足了第二個要素 逐步靠近終止條件。

 

二.遞歸函數的使用

通過以上講解,想必已經了解遞歸函數的原理,

那么遞歸函數是如何寫出來的呢?

如何利用遞歸函數解決實際問題呢?

實例探索遞歸函數的書寫“套路”

例題:計算n的階乘。

步驟 1:找到終止條件,寫給 if

數學知識 :n! = n * (n - 1) * (n - 2) * (n -3) * ··· * 3 * 2 * 1

顯然 終止條件 是 n === 1; 時, return 1;故可以完成函數的 前半部分:

 

  1. function fn(n){ 
  2.     if(n === 1){ 
  3.         return 1; 
  4.     } 
  5.     // 未完待續 

步驟2:找到函數的等價關系式,寫給 return

數學知識 :n! = n * (n - 1)!

通過數學知識 n! = n * (n - 1)! 和遞歸函數的本質(調用自身),

可以得出函數的等價關系式為 f(n) = n * f(n - 1);

從而可以完成函數的后半部分:

 

  1. function fn(n){ 
  2.     if(n === 1){ 
  3.         return 1; 
  4.     } 
  5.     return n * fn(n - 1); 

至此簡單的遞歸函數便寫出來了,遞歸函數最大的特點便是代碼簡潔(簡潔到讓人心虛)。

總結,遞歸函數的書寫“套路”

1.找到終止條件,寫給 if

2.找到函數的等價關系式,寫給 return

 

三.遞歸函數的問題

想必你會說,上面的兩個例題用 循環 就能輕松寫出來,為何還需要使用遞歸呢?

其實能用 遞歸 解決的問題,用 循環 也能解決!而且 遞歸 比 循環 的運算速度要慢,因為 遞歸 需要逐層調用函數,占據系統內存,當 遞歸 層級較深時,對性能消耗較大,往往不推薦使用。

問:那遞歸存在的意義是什么?

遞歸 是為了將復雜問題簡單化,提供解題思路,進而得到 “循環算法”

對于簡單問題,一眼便能看出“循環算法”,但對于抽象問題,通常可以先采取 遞歸 思想,如:

例題:某人需要走上10級臺階,有兩種走法,走法A:一步1個臺階;走法B:一步2個臺階。兩種走法可以任意交替使用,問走上10級臺階共有多少種方法?

 

 

 

 

這個問題很難直接看出循環的解題思路,我們不妨從 遞歸 的角度嘗試解決:

當走上第10級臺階只差最后一步時,存在有兩種可能:

第1種:從 第8級 —> 第10級(一步2個臺階)

第2種:從 第9級 —> 第10級(一步1個臺階)

假設:從 第0級 —> 第8級,有 x 種走法;

1,1,1,1,1,1,2,2

1,1,1,1,1,2,1,2

1,2,1,1,1,2,2

1,2,1,2,2,2

·······

// 窮舉不盡,共 x 種,每種走法的最后一步都是 2(個臺階)

假設:從 第0級 —> 第9級,有 y 種走法;

1,1,1,1,1,1,1,2,1

1,1,2,1,1,2,1,1

1,2,1,2,2,1,1

1,2,2,2,2,1

·······

// 窮舉不盡,共 y 種,每種走法的最后一步都是 1(個臺階)

那么,從 第0級 —> 第10級,共有 x + y 種走法。

故,10級臺階走法 = 9級臺階走法 + 8級臺階走法,即 f(10) = f(9) + f(8);

所以我們需要的函數關系式是 f(n) = f(n - 1) + f(n - 2);

接下來找 終止條件:

1級臺階時,走法只有1種(1步1臺階),是 n === 1; 時, return 1;

2級臺階時,走法只有2種(2次1步1臺階 或 1步2臺階),是 n === 2; 時, return 2;

由此可以寫出遞歸函數

 

  1. function fn(n){ 
  2.     if(n === 1 || n === 2){ 
  3.         return n; 
  4.     } 
  5.     return fun(n - 1) + fun(n - 2); 

下圖展示了函數的執行過程

 

 

 

可見,在函數執行過程中重復調用了多次相同的函數(相同背景色),從而極大消耗了系統的性能。經過測試這個 遞歸函數 最多可計算至 f(45);左右的結果(測試需謹慎),這便是 遞歸函數 存在的主要問題。

那么如何優化這個問題呢?

即,將 遞歸算法改為循環算法。

通過前面的推導我們知道 f(n) = f(n - 1) + f(n - 2);

1級臺階 ==> 走法:1

2級臺階 ==> 走法:2

3級臺階 ==> 走法:1 + 2 = 3

4級臺階 ==> 走法:2 + 3 = 5

5級臺階 ==> 走法:3 + 5 = 8

6級臺階 ==> 走法:5 + 8 = 13

7級臺階 ==> 走法:8 + 13 = 21······

即,只要知道前兩項(1級臺階和2級臺階)的結果,就可以自底向上依次推算出后面所有項的結果。于是便可以寫出 循環函數

 

  1. function fn(n){ 
  2.     if(n === 1 || n === 2){ 
  3.         return n; 
  4.     } 
  5.     var left = 1; // 左邊的數據 
  6.     var right = 2; // 右邊的數據 
  7.     var sum = 0; 
  8.     for(var i = 3 ; i <= n ; i++){ // 循環從第3項開始 
  9.         sum = left + right; // 計算前一次左右數據的和 
  10.         left = right; // 把前一次的right賦值給下一次的left 
  11.         right = sum; // 把前一次的和賦值給下一次的right 
  12.     } 
  13.     return sum

以上便是通過遞歸思想將抽象問題逐步簡單化,從而得出循環算法的過程。

循環算法 解決了 遞歸 消耗系統性能的問題,可以計算任意數值。

(當數值太大超出JavaScript數值范圍時,返回 Infinity)

 

四.總結

1、遞歸結構簡單,易理解,常用于將抽象問題簡單化。

2、遞歸要有終止條件,否則會變成死遞歸;

3、遞歸算法運行效率低、性能消耗大,遞歸深度較大時慎用(等不到結果);

4、能用遞歸解決的問題大多都能用循環解決。

責任編輯:華軒 來源: AI科技大本營
相關推薦

2022-09-26 09:01:15

語言數據JavaScript

2022-05-26 09:20:01

JavaScript原型原型鏈

2022-10-31 09:00:24

Promise數組參數

2012-02-21 13:55:45

JavaScript

2023-12-04 13:22:00

JavaScript異步編程

2010-07-16 09:11:40

JavaScript內存泄漏

2016-12-27 09:10:29

JavaScript原型鏈繼承

2009-11-18 13:30:37

Oracle Sequ

2009-11-17 17:31:58

Oracle COMM

2011-05-30 14:41:09

Javascript閉

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2013-11-14 15:53:53

AndroidAudioAudioFlinge

2025-05-09 01:30:00

JavaScript事件循環基石

2012-05-21 09:51:25

對象Cocoa

2009-06-22 15:34:00

Javascript

2009-06-18 10:23:03

Javascript 基本框架

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構調度器

2021-07-20 15:20:02

FlatBuffers阿里云Java
點贊
收藏

51CTO技術棧公眾號

最新国产拍偷乱拍精品| 国产精品www.| 在线不卡一区二区| 免费在线观看麻豆视频| 91在线国产观看| 99久久99久久精品| 亚洲精品黄色| 亚洲最大成人网色| 99久久夜色精品国产亚洲96| 日本精品va在线观看| 懂色av一区二区| 九九久久精品一区| 日韩高清一区| 色偷偷综合社区| sm久久捆绑调教精品一区| 精品久久久久99| 日本性爱视频在线观看| 日韩一区二区三区免费看| 无遮挡的视频在线观看| 色哟哟一区二区| 精品亚洲综合| 在线不卡一区二区| 97精品久久久| 未满十八勿进黄网站一区不卡| 亚洲精品一区中文| 成人自拍视频网| 欧美成人免费播放| 极品束缚调教一区二区网站| 日本精品久久久| 久久精品国产www456c0m| 国产色综合天天综合网 | 亚洲成人一区在线| 美女av电影| 91丨九色丨黑人外教| jizz18女人| 亚洲精品视频在线看| 深夜福利视频一区| 日韩区在线观看| 韩国成人在线| 国产69久久精品成人看| 午夜欧美精品久久久久久久| 久久国产精品亚洲va麻豆| 久久97超碰国产精品超碰| 欧美亚洲另类色图| 亚洲一区二区三区视频在线播放 | 精品日本视频| 久久久久久久97| 91精品蜜臀一区二区三区在线| 国产精品区一区二区三在线播放| 99精品免费| 一区二区三区四区免费观看| 国产日韩欧美电影| 天堂av在线资源| 亚洲精品国产综合区久久久久久久 | 国产黑丝在线一区二区三区| 国产女女做受ⅹxx高潮| 精品久久久久久久久久久久久| www.国产精品.com| 亚洲欧洲午夜一线一品| 日韩中出av| 九九九九精品| 久久久99久久| 日韩三级影院| 久久97精品久久久久久久不卡| 亚洲激情久久| 青青草视频在线免费播放| 色婷婷国产精品综合在线观看| 欧美日韩在线观看首页| 国产精品视频999| 久久超碰97人人做人人爱| 性生活免费在线观看| 7777精品久久久大香线蕉| 不卡精品视频| 国产日韩二区| 成人综合在线网站| 人人九九精品| 欧美二区在线播放| 久久久蜜桃一区二区人| 电影天堂久久| 国产午夜一区二区| 在线精品一区| 欧美三级午夜理伦三级| 欧美三级资源在线| 国产精品99久久免费观看| 日韩三级电影| 日韩欧美亚洲成人| 狼人天天伊人久久| 国产在线视频综合| 欧美日韩小视频| 五月天亚洲一区| 精品丰满人妻无套内射| 777午夜精品免费视频| 神马日本精品| 欧美国产亚洲一区| 亚洲国产精品久久久久| 国产精品草草| 国产最顶级的黄色片在线免费观看| 中文字幕亚洲综合久久| 久久一本综合频道| 日本成人一区二区三区| 97av视频在线| 91麻豆精东视频| 欧美7777| 亚洲ai欧洲av| 69堂成人精品免费视频| 在线精品小视频| 日本在线аv| 欧美高清不卡在线| 成人免费看的视频| 国产ktv在线视频| 欧美日韩一区二区视频在线观看| 91黄色免费版| 91精品国产乱码久久久久久久| 日本aⅴ写真网站免费| 57pao国产精品一区| 久久久久久久久久久久久女国产乱 | 国产欧美日韩91| 国产精品国模大尺度视频| 日本在线一区二区| www.欧美黄色| 日韩av在线最新| 免费亚洲电影在线| 日本在线免费| 久久久久se| 91精品婷婷国产综合久久| 亚洲私人影院| melody高清在线观看| 国产精品视频500部| 欧美日韩国产成人在线91| 亚洲网址在线| 国产爆初菊在线观看免费视频网站| 国产女同一区二区| 欧美日韩一二三四五区| 你懂的一区二区| av影片在线看| 亚洲不卡中文字幕| 日韩精品在线免费观看| 东方aⅴ免费观看久久av| 成人免费网站观看| 色乱码一区二区三区熟女| 亚洲黄色www| 国产一区二区三区av电影| 色多多在线观看| 野外做受又硬又粗又大视频√| 亚洲九九九在线观看| av一区二区不卡| 国产精品任我爽爆在线播放| 日本在线中文电影| 不卡视频一区二区| 日韩欧美一级特黄在线播放| 国产呦萝稀缺另类资源| 欧美色片在线观看| 一本色道久久综合狠狠躁篇怎么玩| 欧美bbbbb| 综合电影一区二区三区| 自拍偷拍亚洲图片| 国产精品国产精品国产专区不片| 日本中文字幕在线观看| 亚洲综合成人婷婷小说| 亚洲综合自拍偷拍| 婷婷伊人综合| 成年人在线观看网站| 日韩av电影免费播放| 日韩精品中文字幕久久臀| 成人丝袜18视频在线观看| av在线亚洲一区| 视频在线观看免费高清| 欧美一级视频在线观看| 午夜免费久久看| 亚洲精品一二三区区别| 黄色小网站在线观看| 最近中文字幕免费mv| 久久天天躁日日躁| 亚洲人一二三区| 亚洲网站视频| 国产精品专区免费| 天天干天天玩天天操| 91精品啪aⅴ在线观看国产| 欧美一区二区日韩| www.亚洲国产| 国产一区二区三区四区五区| 成人精品一区二区三区免费| 一区二区不卡视频| 自拍偷拍亚洲激情| 伊人影院久久| 91精品xxx在线观看| 日本在线аv| 日本一区二区精品| 久久电影一区二区| 欧美视频在线免费看| 黑人巨大精品欧美黑白配亚洲| 国产精品白丝一区二区三区| 在线观看二区| 日本女优爱爱视频| 国产视频不卡| 欧美第一黄网免费网站| 欧美精品日韩精品| 国产精品色婷婷| 久久天堂精品| 欧美丝袜丝交足nylons172|