递归概述与递归能解决的问题和规则 [数据结构][Java]
递归概述与递归能解决的问题和规则
递归 : recursion
递归的概念:
简单的说: 递归就是方法自己调用自己,每次调用的时候传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变的更加简洁
最基本的递归算法:
package com.ffyc.recursion;public class SimpleRecursion {//测试方法public static void main(String[] args) {int factorial = factorial(4);System.out.println(factorial);}//使用最简单的递归求解阶乘public static int factorial(int n) {if (n == 1) {return 1;}else{return factorial(n - 1) * n;}}
}
递归能解决的问题:
各种数学问题: (比如:)
①八皇后问题
②汉诺塔问题
③阶乘问题
④迷宫问题
⑤球和篮子的问题
- 以上都是google编程大赛中出现过的题目
各种算法中也会使用到递归:(比如:)
①快速排序
②归并排序
③二分查找
④分治算法
等等
用栈解决的问题可以使用递归进行解决(使用递归解决的代码会比较简洁)
还有树 和 图中的很多问题 :
①求最小生成树②求最短路径
等等
递归需要遵守的重要规则
- 执行一个方法时,就会创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互之间影响(比如: 我们之前讲阶乘的时候,不同的栈空间中的变量n的值是不同的)
- 但是如果方法中使用的是引用类型变量(比如数组) ,则多个栈空间中就会共享该数组(引用类型的数据)
- 因为我们的引用类型变量是存储在堆空间或者方法区中的,多个栈中可以共享一个堆或者方法区中的数据,而基本数据类型的数据是存储在栈空间中的,所以不同的栈中有互不相干的基本数据类型的变量
- 但是如果方法中使用的是引用类型变量(比如数组) ,则多个栈空间中就会共享该数组(引用类型的数据)
- 递归必须向退出递归的条件逼近, 否则就会出现无限递归的问题,出现StackOverflowError
- 无限递归简称为:“死龟了”,哈哈
- 当一个方法执行完毕之后,或者是遇到return结束之后,就会返回,谁调用这个方法,那么就将结果返回给谁
补充:
递归的本质: 将原来的问题转化为更小的同一问题
递归 = 终止条件 + 递归操作
递归概述与递归能解决的问题和规则 [数据结构][Java]相关推荐
- 全排列(含递归和非递归的解法)
全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...
- 汉诺塔的改编题(用栈求解,分别递归和非递归)
限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间,求当塔有N层的时候,打印最优移动过程和最优移动总步数 例如:当塔为两层时,最上层的塔记为1,最下层的塔记为2,则 ...
- 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)
二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...
- 九十五、二叉树的递归和非递归的遍历算法模板
@Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...
- 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...
- python递归和循环的区别_递归与伪递归区别,Python 实现递归与尾递归
递归函数在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函 数.(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出 ...
- 递归函数非递归化_递归神秘化
递归函数非递归化 by Sachin Malhotra 由Sachin Malhotra 递归神秘化 (Recursion Demystified) In order to understand re ...
- 递归 尾递归_递归,递归,递归
递归 尾递归 by Michael Olorunnisola 通过Michael Olorunnisola 递归,递归,递归 (Recursion, Recursion, Recursion) Bef ...
- java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...
最新文章
- 自定义Flex Library的使用
- linux命令文件加密软件,Linux系统下如何加密文件,简单实用的文件管理器GnuPG
- linux中安装软件,查看、卸载已安装软件方法
- 运用事理图谱搞事情:新闻预警、事件监测、文本可视化、出行规划与历时事件流生成
- Kube-OVN:基于OVN的开源Kubernetes网络实践
- 如何将32 x 32像素图标转换为16 x 16像素值的图标
- Dubbo的设计理念原来就藏在这三张图中
- android引导用户打开位置权限_想升级 App?先要个权限吧!!!
- linux oracle11.2安装 ins-1010,ARCHLINUX下安装oracle11g
- 【源码小记】jQueryの事件绑定
- oracle trace详解,Oracle autotrace参数详解
- 完美二叉树, 完全二叉树和完满二叉树
- java设置窗体图标_在java中怎么设置窗体的图标?详细步骤图解
- torch.optim.SGD参数详解(除nesterov)
- android文件恢复,安卓手机文件丢失了,如何恢复?
- mapbox-gl加载带环境贴图白模(视频)
- 选择OA,终极“避雷”方法来啦!
- Xcode插件所在的目录:~/Library/Application Support/Developer/Shared/Xcode/Plug-ins
- 游戏开发41课 unity 目录分析
- 学习英语的历史性转折