递归
定义
程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
实例
问题1:求n个整数的积?
分析2:
n | 积 f() |
---|---|
1 | f(1) = 1 |
2 | f(2) = 2 x f(1) |
3 | f(3) = 3 x f(2) |
… | |
n | f(n) = n x f(n-1) |
代码如下:
var f = function(n) {
if (n === 1) return 1
return n * f(n - 1)
}
console.log(f(5)) // 120
问题2:1个细胞,一个小时分裂一次,生命周期是3小时,求n小时后容器内,有多少细胞?
分析2:n小时后的细胞数 = 之前的细胞总数 x 2(一分为二)- 3小时前分裂出来的细胞数(死亡)
小时 n | 细胞总数 t() | 当时分裂出来的细胞数 c() |
---|---|---|
0 | t(0) = 1 | c(0) = 1 |
1 | t(1) = t(0) x 2 | c(1) = c(0) |
2 | t(2) = t(1) x 2 | c(2) = c(1) + c(0) |
3 | t(3) = t(2) x 2 - c(0) | c(3) = c(2) + c(1) + c(0) |
4 | t(4) = t(3) x 2 - c(1) | c(4) = c(3) + c(2) + c(1) |
… | ||
n | t(n) = t(n-1) x 2 - c(n-3) | c(n) = c(n-1) + c(n-2) + c(n-3) |
代码如下:
// 细胞总数
var total = function(n) {
if (n === 0) return 1
return total(n - 1) * 2 - current(n - 3)
}
// 当时分裂出来的细胞数
var current = function(n) {
if (n === 0) return 1
if (n < 0) return 0
return current(n - 1) + current(n - 2) + current(n - 3)
}
console.log(total(5)) // 24
必要因素
1、递归方程
- 在有限次可预见的结果中,找到结果与上一次或几次结果之间的关系。
- 在草稿纸上写出前几次的结果,或者画图,这样更容易找到规律,这种规律实际上就是递归方程。
2、递归边界条件
即已知条件,如上述的 n=0
时的已知结果。这就是递归的边界条件,因为递归不能无限制地调用本身。