From d4640a262d87c280547efaa540a64ddc77b6493b Mon Sep 17 00:00:00 2001 From: Owen <469564715@qq.com> Date: Mon, 23 May 2016 11:32:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0fibonacci=20=E5=B0=BE?= =?UTF-8?q?=E9=80=92=E5=BD=92=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阮老师你好,阅读完您关于 尾递归这方面的研究书稿后,我自己使用了尾递归实现了计算fibonacci数列的方法,觉得比较有代表性 由非尾递归的fibonacci数列的 和 尾递归的fibonacci数列 比较,更加说明尾递归优化的重要性 此外fibonacci数列也是测试性能的常用算法 如果因为我的理解不深刻,浪费了老师宝贵时间,望老师见谅 --- docs/function.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/function.md b/docs/function.md index 41cdf03..f468571 100644 --- a/docs/function.md +++ b/docs/function.md @@ -1195,6 +1195,37 @@ function factorial(n, total) { factorial(5, 1) // 120 ``` +还有一个比较著名的例子,就是计算fibonacci 数列,也能充分说明尾递归优化的重要性 + +如果是非尾递归的fibonacci 递归方法 + +```javascript +function Fibonacci (n) { + if ( n <= 1 ) {return 1}; + + return Fibonacci(n - 1) + Fibonacci(n - 2); +} + +Fibonacci(10); // 89 +// Fibonacci(100) +// Fibonacci(500) +// 堆栈溢出了 +``` + +如果我们使用尾递归优化过的fibonacci 递归算法 + +```javascript +function Fibonacci2 (n , ac1 = 1 , ac2 = 1) { + if( n <= 1 ) {return ac1}; + + return Fibonacci2 (n-1 , ac2 , ac1 + ac2); +} + +console.log(Fibonacci2(100)) // 354224848179262000000 +console.log(Fibonacci2(1000)) // 4.346655768693743e+208 +console.log(Fibonacci2(10000)) // Infinity +``` + 由此可见,“尾调用优化”对递归操作意义重大,所以一些函数式编程语言将其写入了语言规格。ES6也是如此,第一次明确规定,所有ECMAScript的实现,都必须部署“尾调用优化”。这就是说,在ES6中,只要使用尾递归,就不会发生栈溢出,相对节省内存。 ### 递归函数的改写