JavaScript随笔——递归
什么是递归?
程序调用自身的编程技巧称为递归( recursion)。归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 。
递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归例子:
1、 求和 1...1000
function getSum(num) { if(num === 1) { return num } else { // return num + getSum(num - 1) // 如果 var getterSum = getSum, getSum = null 会报错 return num + arguments.callee(num - 1) } } const value = getSum(1000) console.log(value)
2、 奇数项求和
function foo(n){ if(n == 0) return 1; return foo(n-1) + 2; } function sum(n){ if(n == 0) return 1; return foo(n) + sum(n-1); } console.log(sum(0)) // 1 0是指从第零项(1)开始
3、偶数项求和
// 第0项为2,第1项为4··· function fn(n){ if(n == 0) return 2; return fn(n-1) + 2; } function sum(n){ if(n==0) return 2; return fn(n) + sum(n-1); } console.log(sum(0)) // 2 0是指从第零项(2)开始
4、尾递归
函数在尾部调用自身就成为尾递归
function factorial(n) { if(n === 1) return n return n * factorial(n - 1) } // 计算n的阶乘,最多需要保存n个调用记录,复杂度为O(n) console.time(1) console.log(factorial(5)) // 120 console.timeEnd(1) // 1: 1.60400390625ms // 如果改为尾递归,只需要保留一个调用记录,复杂度为O(1) function factorial01(n, tntal) { if(n === 1) return tntal return factorial(n - 1, n * tntal) } console.time(2) console.log(factorial01(5, 1)) // 120 console.timeEnd(2) // 2: 0.14404296875ms

浙公网安备 33010602011771号