递归学习

67 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

递归介绍

递归,就是自己调用自己,是一个函数不断引用自身,直到引用的唯一已知对象时止的过程。通常将一个大问题层层转换成一个与原问题相似的小问题来求解。用有限的语句来定义对象的无限集合,一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归主要解决符合以下特点的问题:

该问题可拆解成若干个子问题,所有子问题的求解方法和大问题的求解方法一样,存在结果已知的最小子问题。即子问题须与原始问题为同样的事,且更为简单。不能无限制地调用本身,须有个出口,化简为非递归状况处理。

斐波纳契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21..... I

斐波纳契数列可以使用递归实现,通过总结数据的规律。

1.找规律

观察数据可得f(n) = f(n-1) + f(n-2) (n>=3)

2.数据特殊情况特殊处理

if (n == 1 || n == 2) {
    return 1;
}

全部代码:

这里是在vue中写的方法,所以有this。

fun(n) {
  if (n == 1 || n == 2) {
    return 1;
  }
  // 使用规律f(n) = f(n-1) + f(n-2)
  return this.fun(n - 1) + this.fun(n - 2);
}

青蛙跳台阶

正常青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解答:

1.找规律

可以发现,如果青蛙要跳到第n级上,则可以从第n-1,n-2,n-3级台阶跳上去。那么跳到n-1级、n-2级、n-3级的总数就等于跳到第n级的总数,即f(n) = f(n-1) + f(n-2) + f(n-3) (n>=4)

fun(n) {
  if(n == 1 || n == 2){
    return n
  }
  if(n == 3){
    // 111,12,21,3
    return 4
  }
  // 使用规律f(n) = f(n-1) + f(n-2) + f(n-3) n >= 4
  return this.fun(n - 1) + this.fun(n - 2) + this.fun(n-3);
}

可以看见,当台阶数大于等于4时,可用f(n) = f(n-1) + f(n-2) + f(n-3)计算。

变态青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。 求该青蛙跳上一个n级的台阶总共有多少种跳法。

解答:如果青蛙要跳到n级台阶上,则可从第1,2,...,n-1级台阶跳到第n级台阶上。即 f(n)=f(n-1)+f(n-2)+...+f(1) (1)

f(n-1) = f(n-2)+f(n-3)+f(n-4)+...+f(1) (2)

(1)-(2)可得:f(n) = 2f(n-1)

fun(n) {
  if(n == 1){
    return 1
  }
  // f(n) = 2f(n-1) n>=2
  return 2*this.fun(n - 1);
}