java数据结构读书笔记--引论
1 递归简论
需求:求出f(x)=2f(x-1)+x²的值。满足f(0)=0
public class Recursion {
// 需求: 求出f(x)=2f(x-1)+x²的值。满足f(0)=0
public static void main(String[] args) {
int f = f(1);
System.out.println(f);
}
public static int f(int x){
// 1 当x=1的时候f(1)=1 f(0)=0 f(2)=2f(1)+4=6
if(x==0)
return x;
return 2*f(x-1)+x*x;
}
}
像上面的情况来说。我们知道f(0)=0;如果不知道这个情况,那么程序将不会计算出来。这种情况称之为基准情况,也就是说不需要经过递归而直接就可以计算出来。这就是基准情况。
接着我们再来看一个情况:如下代码所示。
public static int bad(int n){
if(n==0)
return 0;
return bad(n/3+1)+n-1;
}
Exception in thread “main” java.lang.StackOverflowError
at com.gosaint.firstChapter.Introduction.Recursion.bad(Recursion.java:25)
at com.gosaint.firstChapter.Introduction.Recursion.bad(Recursion.java:25)
at com.gosaint.firstChapter.Introduction.Recursion.bad(Recursion.java:25)
程序出现了栈溢出。这是因为没有基准情况的。当n=1,此时bad(1)。但是bad(1)的值不知道,因此无法继续递归下去。也就是说,递归必须要满足的条件:
a 必须存在基准情况
b 能够持续不断的进行单方向的循环
需求:计算 一个数N中的二进制中1的个数:
计算说明:
1 对于一个数,首先将其转换为二进制,对于其中1或者0的个数分别可以如下的计算:
n&(n-1):其中计算1的个数
n|(n+1):其中计算出0的个数
详细的解释下:如9的二进制是:1001。其中的1的个数为2。9&8的结果是1000。消除了右边的1。继续循环消除。从而得到1的个数。
2 对于一个奇数而言,其中二进制中1的个数为n/2的数中二进制的个数加1
递归的方式计算一个数中二进制中1的个数
public static int binarySystem(int N){
if(N%2!=0){
return binarySystem(N/2)+1;
}else {
// 如果N为偶数,二进制中1的个数计算如下:
int n;
for ( n=0;N>0;n++){
N&=(N-1);
}
return n;
}
}
直接进行计算,不适用递归的方式
/**
* 由于n&(n-1)的这种方式可以直接计算,因此可以不用使用递归的方式操作
* @param N
* @return
*/
public static int binarySystem02(int N) {
int n;
for (n = 0; N > 0; n++) {
N &= (N - 1);
}
return n;
}
java数据结构读书笔记--引论的更多相关文章
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- Java并发读书笔记:线程安全与互斥同步
目录 导致线程不安全的原因 什么是线程安全 不可变 绝对线程安全 相对线程安全 线程兼容 线程对立 互斥同步实现线程安全 synchronized内置锁 锁即对象 是否要释放锁 实现原理 啥是重进入? ...
- 单元测试之道Java版——读书笔记
单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- 《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...
- 《Effective Java》读书笔记 - 11.序列化
Chapter 11 Serialization Item 74: Implement Serializable judiciously 让一个类的实例可以被序列化不仅仅是在类的声明中加上" ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- java数据结构_笔记(4)_图
图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E) 其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...
随机推荐
- CSS选择器(三)
九.CSS 伪类 (Pseudo-classes) CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪类 (Pseudo-classes)实例: 1.向文档中的超链接添加不同的颜色. <s ...
- 牛客小白月赛1 A 简单题 【数学】
题目链接 https://www.nowcoder.com/acm/contest/85/A 思路 这个 就是 E 但是 运算的时候 要保证 其精度 AC代码 #include <cstdio& ...
- 培训笔记——ubuntu安装
1.选择安装位置,如果是做双系统提前准备一个分区,如果覆盖安装就无所谓了2.下载iso镜像文件,制作启动盘,Windows或linux环境下分别有相应的软件可以制作启动光盘或U盘3.开始安装一 设置开 ...
- flex 组件重写 组件生命周期
AS方式重写组件常规步骤 1.如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins) 2.创建ActionScript类文件 ⑴从一个基类扩展,比如UIComponent或者其他 ...
- 如何在 Eclipse 中使用命令行
虽然我们已经有了像 Eclipse 这样高级的 IDE,但是我们有时候也是需要在开发的时候使用 Windows 的命令行,来运行一些独立的程序.在两个程序中切换来切换去是很麻烦的.所以 Eclipse ...
- 算法(Algorithms)第4版 练习 1.4.1
=N(N-1)(N-2)/6
- 超快的maven setting文件
<?xml version="1.0"?> <settings> <localRepository>/home/yizhen/.m2/repos ...
- matlab产生很多个相同的数字
如产生100行1列的0.5: ones(100,1)*0.5:
- 单机版 JedisUtil({基本操作封装工具类})【二】
<!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...
- io.js的六大新特性
io.js是nodejs的友好版的分支("friendly fork”).它支持npm中所有的同样模块,且使用了v8最新版本的截取(v8是被node.js使用js解释器),且修复了很多的bu ...