如何理解递归的原理?
**
什么是递归算法?什么是递归?(英语: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));
=======
斐波那契的时间复杂度计算涉及到高等数学代数的知识, 我这里不做详细推导。
递归的三大要素:
- 明确你这个函数想要干什么。先不管函数里面的代码什么,而是要先明白,你这个函数的功能是什么,要完成什么样的一件事。
- 寻找递归结束条件。我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
- 找出函数的等价关系式。我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
递归的优点:
实现简单,可读性好,递归的强大之处在于它允许用户用有限的语句描述无限的对象。因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的,这一点是循环不太容易做到的。
递归的缺点:
递归调用占用空间大,易发生栈溢出,重复计算,在分解问题到不能再分解的步骤时,要让递归有退出的条件,否则就会陷入死循环,最终导致内存不足引发栈溢出异常**
=======
其实最重要的是思路,不是代码,代码不过是去实现你思路的工具,重在思路创造者,而不是思路执行者。
如何理解递归的原理?相关推荐
- 通俗易懂理解GBDT算法原理-转
GBDT算法深入解析 https://www.zybuluo.com/yxd/note/611571 通俗易懂理解GBDT算法原理 https://blog.csdn.net/qq_36696494/ ...
- python模块之HTMLParser之穆雪峰的案例(理解其用法原理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...
- 赠书:深入理解MySQL主从原理
根据经验,想要快速学习一门技术有3种方式. 第一种方式是通过代码来理解它的实现,反推它的逻辑. 这种方式的难度很大,而且起点相对高,能够沉浸其中的人非常少,过程相对来说是苦闷的,但如果能够沉下心来看代 ...
- 不同类的方法 事务问题_深入理解 Spring 事务原理
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...
- python语言的理解-使用Python语言理解递归
递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...
- 模拟问路场景理解递归
递归:函数内部调用自己 1 # TODO:模拟问路场景理解递归 2 person_list = ['chen', 'wang', 'li', 'liu'] 3 def say_way(person_l ...
- python递归详解_Python理解递归的方法总结
递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...
- 如何快速理解递归——蓝桥杯 试题 基础练习 FJ的字符串(递归与非递归解法)——10行代码AC
励志用少的代码做高效的表达. 注意点: 1.规律 2.非递归解法:string重载了+=运算符,因此用string会方便很多.并且string动态扩充,防浪费,更高效. 3.递归解法:官方的标签就是递 ...
- 递归循环一个无限极数组_理解递归、尾调用优化和蹦床函数优化
想要理解递归,您必须先理解递归.开个玩笑罢了, 递归 是一种编程技巧,它可以让函数在不使用 for 或 while 的情况下,使用一个调用自身的函数来实现循环. 例子 1:整数总和 例如,假设我们想要 ...
最新文章
- C#精髓 第四讲 GridView 72般绝技
- IE8 CSS HACK 兼容集合
- 控制iOS的导航栏和状态栏的样式
- JMX:一些入门说明
- Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
- 前端学习(2851):简单秒杀系统学习之相对定位
- RegexDemo6
- 代码重用_WebAssembly的速度和代码重用
- HCNA配置浮动静态路由
- Ubuntu安装SublimeText3
- scrollTop、clientHeight、 scrollHeight...学完真的理解了
- 3ds max批量修改贴图名称脚本(最新版本)
- python书籍推荐1001python书籍推荐_Python之codebook笔记
- iOS打包ipa无签名打包企业签
- 支教笔记 我在泸定的那十天
- 解决Windows10家庭版系统无法安装Docker Desktop问题
- Mac下用docker安装阿波罗Apollo
- android电梯程序设计,[源码和文档分享]基于Android实现的电梯调度模拟
- 基于Android的旅游app的设计与实现
- 【数学建模】基于matlab武汉地铁2号线路线地图动态模拟【含Matlab源码 1092期】