面试中常见的算法之Java中的递归
1、方法定义中调用方法本身的现象
2、递归注意实现
1) 要有出口,否则就是死递归
2) 次数不能太多,否则就内存溢出
3) 构造方法不能递归使用
3、递归解决问题的思想和图解:
分解和合并【先分解后合并】
1. 常见的斐波那契数列
1,1,2,3,5,8,13,21,...
特征: 从第三个数开始,每个数是前两个数的和。
int count = 0;
private int getFibo(int i) {
if (i == 1 || i == 2) {
count = count+1;
System.out.println("第" +count+"次进行运算 并返回结果1" );
return 1;}
else
{
count = count+1;
System.out.println("第" +count+"次进行运算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
return getFibo(i - 1) + getFibo(i - 2);
}
}
@Test
public void test01() {
int value = getFibo(6);
System.out.println(value);
}



2. 阶乘
10!= 10 * 9 * 8 * 7 * (... )* 1
9! = 9 * 8 * 7 * (... )* 1
8! = 8 * 7 * (... )* 1
特征:
9!=9* 8!
10! =10 * 9!
//阶乘
private int get(int i){
int result = 1;
if (i == 1) {
count = count+1;
System.out.println("第" +count+"次进行运算 并返回结果* 1" );
result = result * 1;
}
else {
count = count+1;
System.out.println("第" +count+"次进行运算" + "get(" +(i-1)+")" );
result = i * get(i-1);
}
return result; } @Test
public void test01() {
//System.out.println(getFibo(6));
System.out.println(get(5));
}


3. 加法实现1+2+3+4+5+...+100=
//求和
private int fsum(int i){ if (i <= 0) {
count = count+1;
System.out.println("第" +count+"次进行运算并返回0" );
return 0;
}
else {
count = count+1;
System.out.println("第" +count+"次进行运算且返回 " + i +" + fsum(" +(i-1)+")" );
return (i + fsum(i-1)); } } @Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
System.out.println(fsum(10)); }
4. 实现打印乘法表
//打印乘法表
//for 循环实现
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//递归实现
public static void getByRecursion(int n) {//递归 实现
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
} @Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10)); getByFor(8);
getByRecursion(9); }
6. 汉诺塔游戏
三根木棒,n个依次增大的空心圈圈,每次移动一个圈圈到木棒上,且任何时候保证小的圈圈不能被大的圈圈压在下面。
2的n次方-1

//5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "号盘子从" + a + "到" + c);
count = count+1;
return count; } else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
return count;
} } @Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10)); //getByFor(8);
//getByRecursion(9); int count =hanio(3,'A','B','C');
System.out.println(count); }
代码:
package com.example.demo;
import org.junit.Test;
public class Test02 {
int count = 0;
//1. 斐波那契数列递归,用的时候请将count和输出System.Out去除
private int getFibo(int i) {
if (i == 1 || i == 2) {
count = count+1;
System.out.println("第" +count+"次进行运算 并返回结果1" );
return 1;}
else
{
count = count+1;
System.out.println("第" +count+"次进行运算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
return getFibo(i - 1) + getFibo(i - 2);
}
}
//2. 阶乘
private int get(int i){
int result = 1;
if (i == 1) {
count = count+1;
System.out.println("第" +count+"次进行运算并返回result * 1" );
result = result * 1;
}
else {
count = count+1;
System.out.println("第" +count+"次进行运算且返回 " + i+" * get(" +(i-1)+")" );
result = i * get(i-1);
}
return result;
}
//3. 求和
private int fsum(int i){
if (i <= 0) {
count = count+1;
System.out.println("第" +count+"次进行运算并返回0" );
return 0;
}
else {
count = count+1;
System.out.println("第" +count+"次进行运算且返回 " + i +" + fsum(" +(i-1)+")" );
return (i + fsum(i-1));
}
}
//打印乘法表
//for 循环实现
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//4. 递归实现
public void getByRecursion(int n) {//递归 实现
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
//5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "号盘子从" + a + "到" + c);
count = count+1;
return count;
} else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
return count;
}
}
@Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10));
//getByFor(8);
//getByRecursion(9);
int count =hanio(3,'A','B','C');
System.out.println(count);
}
}
package com.example.demo;
import org.junit.Test;
public class Test03 {
int count = 0;
//1. 斐波那契数列递归,用的时候请将count和输出System.Out去除
private int getFibo(int i) {
if (i == 1 || i == 2) {
return 1;}
else
{
return getFibo(i - 1) + getFibo(i - 2);
}
}
//2. 阶乘
private int get(int i){
int result = 1;
if (i == 1) {
result = result * 1;
}
else {
result = i * get(i-1);
}
return result;
}
//3. 求和
private int fsum(int i){
if (i <= 0) {
return 0;
}
else {
return (i + fsum(i-1));
}
}
//打印乘法表
//for 循环实现
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//4. 递归实现
public void getByRecursion(int n) {//递归 实现
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
//5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "号盘子从" + a + "到" + c);
count = count+1;
return count;
} else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
return count;
}
}
@Test
public void test01() {
System.out.println(getFibo(6));
System.out.println(get(5));
System.out.println(fsum(10));
getByFor(8);
getByRecursion(8);
int count =hanio(3,'A','B','C');
System.out.println(count);
}
}
面试中常见的算法之Java中的递归的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)
/* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...
- iOS面试中常见的算法题目
一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 最近在准备面试,总结了几个java中面向对象的几个问题,问题本事还不够全面,要想知道还是要自己去找,但是在面试上应该是没多大问题了
Overload(重载)与Override(重写)的区别 重载:发生在一个类中,方法名称相同,参数列表不同,方法体不同(看对象类型) 重写:发生在父类中,方法名称相同,参数列表相同,方法体不同(看引用 ...
- 几种常见排序算法的java实现
一.几种常见的排序算法性能比較 排序算法 最好时间 平均时间 最坏时间 辅助内存 稳定性 备注 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时较好 直接插入排序 O( ...
- java中接口的简单运用&java中的一些异常(运用myeclipse)
package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...
- .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...
随机推荐
- top(k,n)—db kernel队解题思路
0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...
- UWP 应用中的Back button(TitleBar) 的处理
后退按钮是一项系统提供的 UI 提示,可以在后退堆栈或用户导航历史记录中支持向后导航. 用起来其实也是很简单的,只需要在App.xaml.cs 中修改(添加)如下红色代码,便可实现.. sealed ...
- ASP 用隐藏域解决Http无状态问题
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- C# TCP 通讯
//接收 using System; using System.Collections.Generic;using System.ComponentModel;using System.Data;us ...
- WPF三维图形
原文:WPF三维图形 wpf 三维图形基础生成三维图形的基本思想是能得到一个物体的三维立体模型(model).由于我们的屏幕只有二维,因而我们定义了一个用于给物体拍照的照相机(Camera).拍到的照 ...
- Resources.resx 未将对象引用设置到对象的实例
原文:解决使用DevExpress开发错误:未将对象引用设置到对象的实例 在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完毕的代码发过来,却出现“未将对象引用设置到对象的实例 ...
- SignalR的简单实现(一)
原文:SignalR的简单实现(一) ASP.NET SignalR是ASP.NET开发人员的一个新库,它使您的应用程序添加实时Web功能变得非常简单.什么是"实时网络"功能?能够 ...
- Linux 下 Redis 服务 Shell启动脚本
# chkconfig: 2345 10 90 # description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin ...
- C#二分查找法 破洞百出版本
二分查找法在数据繁多的数据中查找是一种快速的方法,每次查找最多需要的次数 为2的n次方小于总个数. 当然是有前提的,就是需要把数据先排好序,这里指的都是数值型的数据. 基本思想就是把需要找的值与排序好 ...
- DLL里面socket(Delphi的代码)
http://hi.baidu.com/game_base/item/f617e4136414148889a956ed 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发 ...