算法基础:递归算法知识笔记
1、递归算法定义
递归算法是将重复问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。
简单来说就是自己调用自己。直到达到退出递归的条件,则完成递归。
2、递归的步骤
1、找整个递归的终止条件:递归应该在什么时候结束?
2、找返回值:应该给上一级返回什么信息?
3、本级递归应该做什么:在这一级递归中,应该完成什么任务?
3、递归的优点和缺点
优点:递归的核心思想就是将一个大问题,拆解成一个小问题,然后将小问题再次拆解,层层拆分从而简化问题的实现。从而达到简化重复的代码让程序变得更加简洁。
缺点:使用递归算法时每次方法的调用都需要在栈中开辟出一个空间保存相关数据,频繁的压栈、弹栈会导致效率变低。
4、递归的案例
4.1 阶乘的算法
// 阶乘的递归实现
public static long f(int n){
if(n == 1) // 结束递归终止条件
return 1;
return n*f(n-1); // 相同重复逻辑,缩小问题的规模
}
4.2 斐波纳契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
public static int fibonacci(int n) {
if (n == 1 || n == 2) { // 递归终止条件
return 1; // 简单情景
}
return fibonacci(n - 1) + fibonacci(n - 2); // 相同重复逻辑,缩小问题的规模
}
4.3 汉诺塔问题
/**
* Title: 汉诺塔问题
* Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,
* 小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。
*
*/
public class HanoiTower {
/**
* @description 在程序中,我们把最上面的盘子称为第一个盘子,把最下面的盘子称为第N个盘子
* @author rico
* @param level:盘子的个数
* @param from 盘子的初始地址
* @param inter 转移盘子时用于中转
* @param to 盘子的目的地址
*/
public static void moveDish(int level, char from, char inter, char to) {
if (level == 1) { // 递归终止条件
System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
} else {
// 递归调用:将level-1个盘子从from移到inter(不是一次性移动,每次只能移动一个盘子,其中to用于周转)
moveDish(level - 1, from, to, inter); // 递归调用,缩小问题的规模
// 将第level个盘子从A座移到C座
System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
// 递归调用:将level-1个盘子从inter移到to,from 用于周转
moveDish(level - 1, inter, from, to); // 递归调用,缩小问题的规模
}
}
public static void main(String[] args) {
int nDisks = 30;
moveDish(nDisks, 'A', 'B', 'C');
}
4.4 二叉树深度
public static int getTreeDepth(Tree t) {
// 树为空
if (t == null) // 递归终止条件
return 0;
int left = getTreeDepth(t.left); // 递归求左子树深度,缩小问题的规模
int right = getTreeDepth(t.left); // 递归求右子树深度,缩小问题的规模
return left > right ? left + 1 : right + 1;
}
IT技术分享社区
个人博客网站:https://programmerblog.xyz
文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识
1、递归算法定义
递归算法是将重复问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。
简单来说就是自己调用自己。直到达到退出递归的条件,则完成递归。
2、递归的步骤
1、找整个递归的终止条件:递归应该在什么时候结束?
2、找返回值:应该给上一级返回什么信息?
3、本级递归应该做什么:在这一级递归中,应该完成什么任务?
3、递归的优点和缺点
优点:递归的核心思想就是将一个大问题,拆解成一个小问题,然后将小问题再次拆解,层层拆分从而简化问题的实现。从而达到简化重复的代码让程序变得更加简洁。
缺点:使用递归算法时每次方法的调用都需要在栈中开辟出一个空间保存相关数据,频繁的压栈、弹栈会导致效率变低。
4、递归的案例
4.1 阶乘的算法
// 阶乘的递归实现
public static long f(int n){
if(n == 1) // 结束递归终止条件
return 1;
return n*f(n-1); // 相同重复逻辑,缩小问题的规模
}
4.2 斐波纳契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
public static int fibonacci(int n) {
if (n == 1 || n == 2) { // 递归终止条件
return 1; // 简单情景
}
return fibonacci(n - 1) + fibonacci(n - 2); // 相同重复逻辑,缩小问题的规模
}
4.3 汉诺塔问题
/**
* Title: 汉诺塔问题
* Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,
* 小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。
*
*/
public class HanoiTower {
/**
* @description 在程序中,我们把最上面的盘子称为第一个盘子,把最下面的盘子称为第N个盘子
* @author rico
* @param level:盘子的个数
* @param from 盘子的初始地址
* @param inter 转移盘子时用于中转
* @param to 盘子的目的地址
*/
public static void moveDish(int level, char from, char inter, char to) {
if (level == 1) { // 递归终止条件
System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
} else {
// 递归调用:将level-1个盘子从from移到inter(不是一次性移动,每次只能移动一个盘子,其中to用于周转)
moveDish(level - 1, from, to, inter); // 递归调用,缩小问题的规模
// 将第level个盘子从A座移到C座
System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
// 递归调用:将level-1个盘子从inter移到to,from 用于周转
moveDish(level - 1, inter, from, to); // 递归调用,缩小问题的规模
}
}
public static void main(String[] args) {
int nDisks = 30;
moveDish(nDisks, 'A', 'B', 'C');
}
4.4 二叉树深度
public static int getTreeDepth(Tree t) {
// 树为空
if (t == null) // 递归终止条件
return 0;
int left = getTreeDepth(t.left); // 递归求左子树深度,缩小问题的规模
int right = getTreeDepth(t.left); // 递归求右子树深度,缩小问题的规模
return left > right ? left + 1 : right + 1;
}
IT技术分享社区
个人博客网站:https://programmerblog.xyz
文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识
算法基础:递归算法知识笔记相关推荐
- php基础语法知识笔记(一)
共享一份我自己学习php基础语法知识的笔记,这是第一弹,明天共享第二弹. 1.判断php短标记<??>是否适用,查看php配置文件php.ini中的"short_open_tag ...
- 计算机网络基础概念知识笔记
1.计算机网络的发展阶段 1.1.具有通信功能的单机系统 该阶段的模式为终端-计算机网络,属于早期计算机网络的主要形式.它将一台计算机经过通信线路和若干个终端直接相连 1.2 具有通信功能的多机系统 ...
- 【学习笔记】Python基础入门知识笔记,万字攻略带你走进Python编程
Python笔记,由此开始吧 本文是笔者在学习Python过程做的笔记总结,将简要讲述Python的基础知识,内容清晰易理解,相信你也能轻松的学会Python的入门基础知识内容.同时也希望这篇文章 ...
- 北大郭炜教授《程序与算法(二)算法基础》学习笔记
目录 第一章 枚举 例题一 完美立方 例题二 生理周期 例题三 称硬币 例题四 熄灯问题 第二章 递归(一) 例题一 求阶乘 例题二 汉诺塔 例题三 n皇后问题 例题四 逆波兰表达式 补充笔记(fro ...
- javaSE基础进阶知识笔记2
日期与时间 Date package org.example.d1_date;import java.util.Date;/*** 目标:学会使用Date类处理时间并获取时间信息*/ public c ...
- 汇编程序基本原理知识笔记
1.汇编语言的概念 定义:为特定计算机或计算机系统设计的面向机器的符号化程序设计语言.汇编程序也就是用汇编语言编写的程序.计算机要运行汇编程序需要用专门的翻译程序进行翻译,然后计算机才可以识别. 汇编 ...
- Java七十四: Java基础/核心知识总结 — — “Java千字文”
Java基础/核心知识总结 - - "Java千字文" Java基础/核心知识笔记终于完结,从Java语言诞生到jdk8新特性,共计74篇博文,43幅自制插图,35张表格,7万6千 ...
- access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化
往期回顾 医学科研实验基础知识笔记(一):细胞增殖 医学科研实验基础知识笔记(二):细胞凋亡检测 医学科研实验基础知识笔记(三):细胞周期检测 医学科研实验基础知识笔记(四):细胞自噬研究策略 医学科 ...
- 6-DoF问题相关基础知识笔记
6-DoF问题相关基础知识笔记 一.什么是6-DoF,即6个自由度是什么? 二.PnP算法 三.BOP挑战与官方数据集简介 BOP数据集 BOP toolkit BOP挑战的介绍页面 四.相关论文 C ...
最新文章
- adb 输入很长的内容 (input text) 在模拟机输入框里面快速输入内容
- linux下Redis以及phpredis扩展安装
- python3菜鸟教程pdf-Python 3 教程
- LINQ之路系列博客后记
- Docker应用五:使用Dockerfile部署MongoDB
- python嵌套列表索引 index_Python:嵌套lis中元素的索引列表
- Android的post()方法究竟运行在哪个线程中
- 1489 数据结构:矩阵鞍点
- 惠普p1106打印机安装步骤_hplaserjetp1106打印机驱动安装说明
- mysql etimedout_NodeJS:MySQL有时会引发ETIMEDOUT错误
- CPU内部架构与工作原理
- BigDecimal.ROUND_HALF_EVEN (银行家算法)
- PDF如何在线翻译?PDF在线翻译的方法
- mac 命令行 解压7z文件_如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法...
- 使用route查看路由表,添加/删除默认路由网关
- 你的typora图床配置了吗?人家都开始收费了
- 基于Linux用C语言实现TCP半双工通信和UDP半双工通信
- 分享和推广产品是成功淘宝客的技巧
- Java面试题(十九) 细说线程池秘境“七大参数”护法的身世
- unity《愤怒的小鸟》初级案例笔记
热门文章
- BYZ原创天语w806测评--入手2天,总结优点、缺点.
- ORB-SLAM2中四叉树管理特征点
- oracle在线sql数据库设计,一款在线ER模型设计工具,支持MySQL、SQLServer、Oracle、Postgresql...
- ubuntu15.10下安装opencv2.4.9python上调用opencv库
- 调焦后焦实现不同距离成像_如何用手机拍出单反的效果,系列学习(一)AF参数“自动调焦”...
- android相对布局代码,Android基础_3 Activity相对布局(示例代码)
- 怎么批量选择目标_全日制专升本一次可以报几个学校?目标院校应该怎么选择?...
- js获取单选按钮的值
- 隐藏与禁用硬盘分区——利用工具或注册表
- docker log 文件 清理