摘要:無路什么數(shù)據(jù)結(jié)構(gòu)最后都是隊(duì)棧嗎一行寫出斐波那契數(shù)列改進(jìn)寫法將找到斐波那契數(shù)列的第項(xiàng)問題轉(zhuǎn)化為在一個(gè)初始項(xiàng)為和的加法序列序列中,每一項(xiàng)都是前兩項(xiàng)的和中找到第項(xiàng)的問題。
常規(guī)寫法
const Fib1 = n => { console.log(`Fib1(${n})`) if (n === 0) { return 0 } else if (n === 1) { return 1 } else { return Fib1(n - 1) + Fib1(n - 2) } } console.log(Fib1(5)) // 函數(shù)調(diào)用順序 // Fib1(5) Fib1(4) Fib1(3) Fib1(2) Fib1(1) Fib1(0) Fib1(1) Fib1(2) Fib1(1) Fib1(0) Fib1(3) Fib1(2) Fib1(1) Fib1(0) Fib1(1)
可以發(fā)現(xiàn)整個(gè)過程是二叉樹先序遍歷的過程。此外,整個(gè)過程中多次調(diào)用了Fib1(3)、Fib1(2)、Fib1(5),產(chǎn)生大量冗余的調(diào)用。無路什么數(shù)據(jù)結(jié)構(gòu)最后都是隊(duì)棧嗎?
一行寫出斐波那契數(shù)列
const Fib1 = n => (n <= 1) ? n : (Fib1(n - 1) + Fib1(n - 2))改進(jìn)寫法1
將找到斐波那契數(shù)列的第n項(xiàng)問題轉(zhuǎn)化為在一個(gè)初始項(xiàng)為t0和t1的加法序列(序列中,每一項(xiàng)都是前兩項(xiàng)的和)中找到第n項(xiàng)的問題。
求以3和7為初始項(xiàng)的第一個(gè)序列中的t6(71)可以轉(zhuǎn)化為求以7和10為初始項(xiàng)的第二個(gè)序列中的t5(71)
const Fib2 = n => { return AdditiveSequence(n, 0, 1) } const AdditiveSequence = (n, t0, t1) => { console.log(`AdditiveSequence(${n},${t0},${t1})`) if (n === 0) { return t0 } else if (n === 1) { return t1 } else { return AdditiveSequence(n - 1, t1, t0 + t1) } } console.log(Fib2(5)) // AdditiveSequence(5,0,1) // AdditiveSequence(4,1,1) // AdditiveSequence(3,1,2) // AdditiveSequence(2,2,3) // AdditiveSequence(1,3,5)改進(jìn)寫法2
求以3和7為初始項(xiàng)的第一個(gè)序列中的t6(71)可以轉(zhuǎn)化為求以10和17為初始項(xiàng)的第二個(gè)序列中的t4(71)
const Fib3 = n => { return AdditiveSequence(n, 0, 1) } const AdditiveSequence = (n, t0, t1) => { console.log(`AdditiveSequence(${n},${t0},${t1})`) if (n === 0) { return t0 } else if (n === 1) { return t1 } else { return AdditiveSequence(n - 2, t0 + t1, t0 + t1 + t1) } } console.log(Fib3(5)) // AdditiveSequence(5,0,1) // AdditiveSequence(3,1,2) // AdditiveSequence(1,3,5)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89278.html
摘要:根據(jù)該規(guī)則,返回第個(gè)斐波那契數(shù)。尾遞歸函數(shù)調(diào)用自身,稱為遞歸。一個(gè)前端眼中的斐波那契數(shù)列解斐波那契數(shù)列的實(shí)用解法調(diào)用棧尾遞歸和手動(dòng)優(yōu)化尾調(diào)用優(yōu)化譯我從用寫斐波那契生成器中學(xué)到的令人驚訝的件事 斐波那契數(shù)列是以下一系列數(shù)字: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ... 在種子數(shù)字 0 和 1 ...
摘要:遞歸概念遞歸是一種針對(duì)簡(jiǎn)單循環(huán)難以編程實(shí)現(xiàn)的問題,通過函數(shù)調(diào)用自身,提供優(yōu)雅解決方案的技術(shù)。擁有基礎(chǔ)情況或終止條件來停止遞歸。這個(gè)稱之為遞歸調(diào)用。為了避免重新創(chuàng)建字符串,使用遞歸輔助方法來進(jìn)行改良。 遞歸概念 遞歸是一種針對(duì)簡(jiǎn)單循環(huán)難以編程實(shí)現(xiàn)的問題,通過函數(shù)調(diào)用自身,提供優(yōu)雅解決方案的技術(shù)。 遞歸都具有以下三個(gè)要點(diǎn): 使用 if-else 或 switch 語(yǔ)句來引導(dǎo)不同的情況。 ...
摘要:前言前幾天面試被問到了斐波那契數(shù)列的實(shí)現(xiàn)以及優(yōu)化的問題,當(dāng)時(shí)現(xiàn)場(chǎng)卡了挺久的,現(xiàn)在進(jìn)行一下總結(jié)使用實(shí)現(xiàn)。題目介紹斐波那契數(shù)列又被稱為黃金分割數(shù)列,指的是這樣的一個(gè)數(shù)列,它有如下遞推的方法定義是正整數(shù),請(qǐng)使用實(shí)現(xiàn)斐波那契函數(shù)。 前言 前幾天面試被問到了斐波那契數(shù)列的實(shí)現(xiàn)以及優(yōu)化的問題,當(dāng)時(shí)現(xiàn)場(chǎng)卡了挺久的,現(xiàn)在進(jìn)行一下總結(jié)(使用js實(shí)現(xiàn))。 題目介紹 ??斐波那契數(shù)列又被稱為黃金分割數(shù)列,指...
摘要:閉包尾遞歸循環(huán)迭代實(shí)現(xiàn)使用方式,主要是看實(shí)現(xiàn)思想從圖中我們可以很明顯的看出,使用尾遞歸計(jì)算斐波那契數(shù)列性能完勝直接遞歸和閉包,特別是當(dāng)數(shù)值比較大的時(shí)候,尾遞歸的作用就越明顯。 前端微專業(yè)JavaScript有一道題目是求斐波那契數(shù)列的,一開始沒想很多,覺得實(shí)現(xiàn)功能自己已經(jīng)很棒棒了(逃)后面有同學(xué)討論直接遞歸特別耗費(fèi)時(shí)間,開始考慮使用閉包,看我們討論的不亦樂乎的大佬也發(fā)話了,指點(diǎn)我們這兩...
摘要:題目題目描述大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個(gè)整數(shù),請(qǐng)你輸出斐波那契數(shù)列的第項(xiàng)從開始,第項(xiàng)為。基本思路這道題在劍指中實(shí)際是當(dāng)作遞歸的反例來說的。明顯也符合斐波那契數(shù)列的規(guī)律矩形覆蓋我們可以用的小矩形橫著或者豎著去覆蓋更大的矩形。 題目 題目描述大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個(gè)整數(shù)n,請(qǐng)你輸出斐波那契數(shù)列的第n項(xiàng)(從0開始,第0項(xiàng)為0)。 基本思路 這道題在劍指offer中...
摘要:所以,遞歸在編程中同樣是很重要的一個(gè)知識(shí)點(diǎn)。舉個(gè)例子用遞歸實(shí)現(xiàn)求第個(gè)斐波那契數(shù)??偨Y(jié)起來四個(gè)字大事化小繼續(xù)舉斐波那契數(shù)的例子三遞歸是怎樣運(yùn)行的我們通過一道題目來講解。 ...
閱讀 2416·2021-11-11 16:54
閱讀 1219·2021-09-22 15:23
閱讀 3660·2021-09-07 09:59
閱讀 2010·2021-09-02 15:41
閱讀 3294·2021-08-17 10:13
閱讀 3062·2019-08-30 15:53
閱讀 1244·2019-08-30 13:57
閱讀 1216·2019-08-29 15:16