成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(八)遞歸

arashicage / 2966人閱讀

摘要:在之前的文章中我們學(xué)習(xí)了幾種常見的數(shù)據(jù)結(jié)構(gòu),接下來我們先了解一下遞歸思想,為我們后面學(xué)習(xí)樹和圖奠定一定的基礎(chǔ)。而如果一直調(diào)用自己的話,最終會導(dǎo)致棧溢出從而導(dǎo)致程序崩潰,這是程序員不想發(fā)生的問題之一。

在之前的文章中我們學(xué)習(xí)了幾種常見的數(shù)據(jù)結(jié)構(gòu),接下來我們先了解一下遞歸思想,為我們后面學(xué)習(xí)樹和圖奠定一定的基礎(chǔ)。

遞歸 理解遞歸

遞歸是一種解決問題的方法。通俗點來講,其核心思想就是函數(shù)自己調(diào)用自己,或者間接調(diào)用自身。而如果一直調(diào)用自己的話,最終會導(dǎo)致棧溢出從而導(dǎo)致程序崩潰,這是程序員不想發(fā)生的問題之一。那么要使用遞歸,就必須遵循的他的一些注意點。首先要注意的是,每個遞歸函數(shù)都有基線條件,也就是不再發(fā)生遞歸的停止點。還有,既然傳遞值或者函數(shù)到??臻g,那么我們就有好習(xí)慣,將不用的或者需要的空間進(jìn)行返回。也可以這樣理解,遞歸其實就是傳遞和歸還。下面一段簡單的代碼進(jìn)行展示。

function understandRecursion(doIunderstandRecursion) {
  const recursionAnswer = confirm("Do you understand recursion?"); // function logic
  if (recursionAnswer === true) { // base case or stop point
    return true;
  }
  understandRecursion(recursionAnswer); // recursive call
}

understandRecursion(false);//continue
understandRecursion(false);//continue
understandRecursion(true);//stop
一些經(jīng)典遞歸算法 階乘
普通迭代實現(xiàn)
function factorialIterative(number) {
  if (number < 0) {
    return undefined;
  }
  let total = 1;
  for (let n = number; n > 1; n--) {
    total  = total * n;
  }
  return total;
}
遞歸實現(xiàn)
function factorial(n) {
    // console.trace();
    if (n === 1 || n === 0) {
      return 1;
    }
  return n * factorial(n - 1);
}

值得注意的是,由于操作系統(tǒng)和瀏覽器的不同,提供的??臻g不同,也就是棧溢出發(fā)生時函數(shù)的執(zhí)行次數(shù)不同,并且在ES6中提供的是尾調(diào)用優(yōu)化,函數(shù)內(nèi)最后一個操作是調(diào)用函數(shù)時,會通過跳轉(zhuǎn)指令jump而不是子程序調(diào)用,導(dǎo)致程序可以一直進(jìn)行。所以在這里,基線條件是萬萬不能忘了添加的。

斐波那契數(shù)列
迭代實現(xiàn)
function fibonacciIterative(n){
  let fibNMinus2 = 0;
  let fibNMinus1 = 1;
  let fibN = n;
  for (let i = 2; i <= n; i++) { // n >= 2
    fibN = fibNMinus1 + fibNMinus2; // f(n-1) + f(n-2)
    fibNMinus2 = fibNMinus1;
    fibNMinus1 = fibN;
  }
  return fibN;
}
遞歸實現(xiàn)
function fibonacciIterative(n){
  let fibNMinus2 = 0;
  let fibNMinus1 = 1;
  let fibN = n;
  for (let i = 2; i <= n; i++) { // n >= 2
    fibN = fibNMinus1 + fibNMinus2; // f(n-1) + f(n-2)
    fibNMinus2 = fibNMinus1;
    fibNMinus1 = fibN;
  }
  return fibN;
}
記憶化斐波那契數(shù)列
function fibonacciMemoization(n) {
  const memo = [0, 1];
  const fibonacci = (n) => {
    if (memo[n] != null) return memo[n];
    return memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
  };
  return fibonacci(n);
}
總結(jié)

迭代版本比遞歸版本快很多,但是遞歸版本更容易理解,需要的代碼通常更少。使用遞歸有些算法不用,因為尾調(diào)用優(yōu)化會造成多余的內(nèi)存消耗,甚至可能會被清除。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109980.html

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)算法之精講「遞歸系列」

    摘要:終止條件遞推公式遞歸的分類通過做大量的題,根據(jù)遞歸解決不同的問題,引申出來的幾種解決和思考的方式。我們通過層與層之間的計算關(guān)系用遞推公式表達(dá)出來做計算,經(jīng)過層層的遞歸,最終得到結(jié)果值。 showImg(https://segmentfault.com/img/remote/1460000019222330); 前言 幾個月之前就想寫這樣一篇文章分享給大家,由于自己有心而力不足,沒有把真...

    zhichangterry 評論0 收藏0
  • 排序算法 JavaScript

    摘要:一冒泡排序算法介紹比較相鄰的兩個元素如果前一個比后一個大,則交換位置。它與冒泡排序的不同之處在于,它會優(yōu)先比較距離較遠(yuǎn)的元素。希爾排序的核心在于間隔序列的設(shè)定。作為一種線性時間復(fù)雜度的排序,計數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)。 一、冒泡排序 算法介紹: 比較相鄰的兩個元素,如果前一個比后一個大,則交換位置。 第一輪把最大的元素放到了最后面。 由于每次排序最后一個都是最大的,...

    Charlie_Jade 評論0 收藏0
  • 皇后,回溯遞歸(Python實現(xiàn))

    摘要:八皇后問題是十九世紀(jì)著名的數(shù)學(xué)家高斯年提出。同時可以擴展為九皇后,十皇后問題。解決方案回溯與遞歸。這樣,編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無論調(diào)用多少次,都只占用一個棧幀,不會出現(xiàn)棧溢出的情況。 八皇后問題是十九世紀(jì)著名的數(shù)學(xué)家高斯1850年提出 。以下為python語言的八皇后代碼,摘自《Python基礎(chǔ)教程》,代碼相對于其他語言,來得短小且一次性可以打印出92種結(jié)果。...

    TZLLOG 評論0 收藏0
  • 動態(tài)規(guī)劃法()最大子數(shù)組問題(maximum subarray problem)

    摘要:動態(tài)規(guī)劃法用表示最大子數(shù)組的結(jié)束下標(biāo)為的情形,則對于,有這樣就有了一個子結(jié)構(gòu),對于初始情形,遍歷就能得到這個數(shù)組,其最大者即可最大子數(shù)組的和。動態(tài)規(guī)劃法想法巧妙,運行效率也高,但是沒有普遍的適用性。 問題簡介 ??本文將介紹計算機算法中的經(jīng)典問題——最大子數(shù)組問題(maximum subarray problem)。所謂的最大子數(shù)組問題,指的是:給定一個數(shù)組A,尋找A的和最大的非空連續(xù)...

    jzman 評論0 收藏0
  • 算法思想

    摘要:基礎(chǔ)算法思想類別遞推枚舉遞歸分治貪婪回溯試探模擬遞推遞推分類順推法從已知條件出發(fā),逐步推算出要解決問題的方法。貪心算法的局限不能保證最后的解是最優(yōu)的不能求最大最小解問題只能求滿足某些約束條件的可行解范圍。 基礎(chǔ)算法思想類別 遞推 枚舉 遞歸 分治 貪婪 回溯(試探) 模擬 遞推 遞推分類 順推法:從已知條件出發(fā),逐步推算出要解決問題的方法。 逆推法:從已知結(jié)果出發(fā),用迭代表達(dá)式...

    sshe 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<