2.1 递归

递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快速排序等问题。

【示例4】使用递归实现n!

public class TestRecursion1 {public static void main(String[] args) {//使用循环求n!int n = 6;int fac = 1;for(int i=1;i<=n;i++){fac = fac * i;}System.out.println(fac);        //使用递归求n!int result = fac(n);System.out.println(result);}    public static int fac(int n){int result;if(n==1){result  = 1;}else{result =  n * fac(n-1);}return result;    }
}

递归的调用过程。

【示例5】使用递归实现斐波那契数列

斐波那契数列(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*)。

public class TestRecursion2 {public static void main(String[] args) {//使用循环实现        int num1 = 1;
int num2 = 1;int numn=0 ;int n= 40;long startTime = System.currentTimeMillis();for(int i=3;i<= n;i++ ){//得到i项的值numn = num1+ num2;//改变num2和num1的值num1 = num2;num2 = numn;       }System.out.println(n+"   "+numn);long endTime = System.currentTimeMillis();System.out.println("循环花费的时间:"+(endTime - startTime));//使用递归实现startTime = System.currentTimeMillis();System.out.println(n+"   "+fibo(n));endTime = System.currentTimeMillis();System.out.println("递归 花费的时间:"+(endTime - startTime));}    public static  int fibo(int n){//1,2,3.....n//给结果指定初始值int result = 0;       //使用递归求结果if(n==1 || n==2){result = 1;}else{result = fibo(n-2) + fibo(n-1);}     //返回结果return result;}
}

递归问题的特点

一个问题可被分解为若干层简单的子问题

子问题和其上层问题的解决方案一致

外层问题的解决依赖于子问题的解决

递归结构包括两个部分:

递归结束条件:什么时候不调用自身方法。如果没有条件,将陷入死循环。

递归体。解答:什么时候需要调用自身方法。

递归的优点

自然的思路,简单的程序

递归的缺点

但是递归调用会占用大量的系统堆栈,内存耗用多,

在递归调用层次多时速度要比循环慢的多

2.2 折半查找

折半查找又称为二分查找,这种查找方法需要待查的查找表满足两个条件:

首先,查找表必须使用顺序存储结构;

其次,查找表必须按关键字大小有序排列。

key=21的查找过程

key=85的查找过程

【示例6】非递归的折半查找

public class BinarySearch {public static void main(String[] args) {int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };System.out.println(searchLoop(array, 101));}public static int searchLoop(int[] array, int findValue) {// 如果数组为空,直接返回-1,即查找失败if (array == null) { return -1;  }// 起始位置int start = 0;// 结束位置int end = array.length - 1;while (start <= end) {// 中间位置int middle = (start + end) / 2;// 中值int middleValue = array[middle];if (findValue == middleValue) {// 等于中值直接返回return middle;} else if (findValue < middleValue) {// 小于中值时在中值前面找end = middle - 1;} else {// 大于中值在中值后面找start = middle + 1;}}// 返回-1,即查找失败return -1;}
}

【示例7】递归的折半查找

public class BinarySearch {public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};System.out.println(binSearch(array, 10));}public static int binSearch(int array[], int key) {int start = 0;int end = array.length - 1;return binSearch(array, start, end, key);}public static int binSearch(int array[], int start, int end, int key) {int mid = (end + start) / 2;if (start > end) {return -1;}if (array[mid] == key) {return mid;} else if (key > array[mid]) {return binSearch(array, mid + 1, end, key);} else {return binSearch(array, start, mid - 1, key);}}
}

本节重点

1. 使用递归实现n!

2. 使用递归实现斐波那契数列

3. 使用非递归算法实现折半查找

4. 使用递归算法实现折半查找

折半查找递归算法_两篇文章带你了解java基础算法之递归和折半查找相关推荐

  1. java 递归_两篇文章带你了解java基础算法之递归和折半查找

    2.1 递归 递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化.递归的基本思想就是"自己调用自己",一个使用递归技术的方法将会直接或者间接的调用自己.利用递 ...

  2. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  3. synchronized()_这篇文章带你彻底理解synchronized关键字

    Synchronized关键字一直是工作和面试中的重点.这篇文章准备彻彻底底的从基础使用到原理缺陷等各个方面来一个分析,这篇文章由于篇幅比较长,但是如果你有时间和耐心,相信会有一个比较大的收获,所以, ...

  4. 两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)

    背景: 上一篇:ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署 已经交待了背景,这篇就省下背景了. 折腾的过程分两步: 第一步是:本机跑虚拟机部署试一下: 第二步 ...

  5. 什么是Apache Spark?这篇文章带你从零基础学起

    导读:Apache Spark是一个强大的开源处理引擎,最初由Matei Zaharia开发,是他在加州大学伯克利分校的博士论文的一部分.Spark的第一个版本于2012年发布. Apache Spa ...

  6. 饥荒机器人怎么解锁_这篇文章带你了解饥荒机器人

    在饥荒这款游戏当中,很多玩家对于里面的一些人物都还是比较了解的,但是唯独是机器人这个角色,是很多饥荒的玩家们都无法了解的人物,不了解他的相关技能,也不知道有关于这个角色的特殊之处,所以为了给大家解决一 ...

  7. 两篇文章带你搞懂GC垃圾回收之基础篇

    文章目录 1.JVM GC回收哪个区域的垃圾? 2.判断对象可以回收的方法 2.1 引用计数法 2.2 可达分析算法 2.3 什么对象可以当作GC Roots? 虚拟机栈中的引用对象 全局的静态的对象 ...

  8. 目前需要开发出一个功能,对比查找并标注出两篇文章中类似的段落或者词句,有什么开源项目有这个功能吗? 其实有点像论文查重的功能,有论文查重的比较通用的开源项目推荐吗?...

    是的,你可以使用论文查重的工具来对比查找并标注两篇文章之间的相似段落或词句. 你可以尝试使用这些开源项目: MOSS (Measure Of Software Similarity):这是一个用于检测 ...

  9. python余弦定理_使用余弦定理计算两篇文章的相似性

    使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码) ...

最新文章

  1. java 操作 redis_java操作Redis
  2. 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
  3. 互联网1分钟 |1211
  4. visualSVN仓库创建及操作
  5. kaggle中安装lightgbm的gpu版本
  6. (数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现
  7. UITextField属性
  8. 多线程-非共享数据(python 版)
  9. 通过js动态设置select中option选中
  10. 在线查服务器地址,工具|查询域名所在服务器的其他网站和IP
  11. 3款堪称神器的电脑软件,简单又实用
  12. spring源码系列(五)——番外篇回答网友的问题
  13. 哈曼收购混合现实领域领先公司Apostera
  14. python并行编程 - 介绍篇
  15. golang下文件锁的使用
  16. 创蓝253短信验证码接口接入常见问题
  17. Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
  18. 算法思想之递归分治回溯
  19. okhttp3发送请求
  20. CSS 字符间距letter-spacing属性

热门文章

  1. C++ 播放音频流(PCM裸流)
  2. HTML5新特性---Form表单前台通过正则表达式自动验证邮箱
  3. 微信账号,欢迎一起探讨信息、知识、学习和管理!
  4. Java中Split函数的用法技巧
  5. centos上用yum安装rar/unrar
  6. linux kprobe rootkit 简介
  7. python 排序 自定义函数
  8. golang 获取文件md5
  9. ddos中的tcp反射攻击技术分析
  10. c语言基本类型学习小结