es6函数之尾递归用法实例分析
本文实例讲述了es6函数之尾递归用法。分享给大家供大家参考,具体如下:
函数调用自身,称为递归,如果尾调用自身,就称为尾递归。
递归非常耗费内存。因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stackoverflow)。但是对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
functionfactorial(n){ if(n===1)return1 returnn*factorial(n-1) }
如果改成尾递归,只保留一个调用记录,复杂度O(1)
functionfactorial(n,total=1){ if(n===1)returntotal returnfactorial(n-1,n*total) } factorial(5)
非尾递归的Fibonacci数列实现如下。
functionFibonacci(n){ if(n<=1){return1}; returnFibonacci(n-1)+Fibonacci(n-2); } Fibonacci(10)//89 Fibonacci(100)//堆栈溢出 Fibonacci(500)//堆栈溢出
尾递归优化过的Fibonacci数
列实现如下。
functionFibonacci2(n,ac1=1,ac2=1){ if(n<=1){returnac2}; returnFibonacci2(n-1,ac2,ac1+ac2); } Fibonacci2(100)//573147844013817200000 Fibonacci2(1000)//7.0330367711422765e+208 Fibonacci2(10000)//Infinity
尾递归的实现,往往需要改写递归函数,确保最后一步只调用自身。做到这一点的方法,就是把所有用到的内部变量改写成函数的参数。
函数式编程有一个概念,叫做柯里化(currying),意思是将多参数的函数转换成单参数的形式。这里可以使用柯里化。
functioncurrying(fn,n){ returnfunction(m){ returnfn.call(this,m,n) } }
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。