**
什么是递归算法?什么是递归?(英语:recursion algorithm)
**
在计算机科学中递归是通过重复将问题分解为同类的子问题而解决问题的方法。递归方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念,计算理论可以证明递归的作用可以完全取代循环。随着科技的发展,计算理论会更多的应用于其他领域。
=============
所谓递归顾名思义就是在过程或函数里调用自身
- 递归在数学中,递归算法是一种直接或者间接调用自身函数或者方法的算法。 通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。
=============
递归的基本原理是什么?有哪些缺点?
- 自上而下
- 每一级的函数调用都有不同的变量。
- 每一次函数调用都会有一次返回。
- 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。
- 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。
==========
实战讲解
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda
Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1,
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
1.我们知道这个函数的功能是求 n 前两项的和;
2.寻找问题与子问题的关系比较简单, 我们以 f(n) 来表示 n 是前两项的和, 显然 f(n) = f(n-2)+f(n - 1), 同时临界条件是 f(1) = 1.
3.将第二步的递推公式用代码表示出来补充到步骤 1 定义的函数中
Java代码
public class Fibonacci_sequence{
private long get_number(lang n){
if(n<2){
return 1;
}
return get_numebr(n-1)+get_number(n-2);
}
public static void main(String[] args){
//打印第十项的斐波那契数;
System.out.println(new Fibonacci_sequence().get_number(10));
}
}
=====
Javascript代码
//n代表第几项
function get_number(n){
if(n<2){
return 1;
}
return get_number(n-1)+get_number(n-2);
}
console.log(get_number(10));
=======
斐波那契的时间复杂度计算涉及到高等数学代数的知识, 我这里不做详细推导。
递归的三大要素:
- 明确你这个函数想要干什么。先不管函数里面的代码什么,而是要先明白,你这个函数的功能是什么,要完成什么样的一件事。
- 寻找递归结束条件。我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
- 找出函数的等价关系式。我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
递归的优点:
实现简单,可读性好,递归的强大之处在于它允许用户用有限的语句描述无限的对象。因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的,这一点是循环不太容易做到的。
递归的缺点:
递归调用占用空间大,易发生栈溢出,重复计算,在分解问题到不能再分解的步骤时,要让递归有退出的条件,否则就会陷入死循环,最终导致内存不足引发栈溢出异常**
=======
其实最重要的是思路,不是代码,代码不过是去实现你思路的工具,重在思路创造者,而不是思路执行者。