Java语言基础1--专题课 递归
2015-07-15 22:36
615 查看
第1节:方法的执行和返回
/** * 用于说明简单的函数调用的顺序 */ public class Demo { public static void main(String[] args) { a(); } public static void a() { System.out.println("A"); b(); System.out.println("C"); } public static void b() { System.out.println(); } }
第2节:方法执行时的内存分配
/** * 用于说明方法执行的内存分配问题 * 其中关于只涉及到栈的说明(更多的之后案例中会呈现的) */ public class Demo { public static void main(String[] args) { int i = 1; c(); System.out.println(i); } public static void c() { d(); } public static void d() { int i = 5; } } // 最终的输出结果是 1(而不是5)
第3&4节:递归概述
第5&6节:阶乘N!的非递归和递归实现
1)非递归实现
/** * 需求:已知 斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2) * 斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、... * 求出第n个斐波那契数 * * 分析: * 1、设F(0)为 a(a=0),设F(1)为b(b=1) * 2、递推得到F(2)=b+a;F(3)=(b+a)+b ..... * 3、总结规律: * n = 0 时 F(0) = a; * n = 1 时 F(1) = b; * * 当n >=2 时 * F(2) = b + a * F(3) = (b+a) + a * ------------------------- * 下一项的等式右面的第一个数 等于上一项的等式右面之和 * 下一项的等式右面的第二个数 等于上一项的等式右面第一项 * * 编码实现:FibForDemo类--注意 n 为负整数的情况 * */ import java.util.Scanner; public class FibForDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个非负整数n:"); long n = sc.nextLong(); // 接收用户的输入 if(n < 0) { System.out.println("请输入一个非负整数!"); return; } long a = 0; // 记录 F(0) long b = 1; // 记录 F(1) //1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义) long fib = -1; //2、判断当前输入是否为0 if(n == 0) { fib = a; // fib为F(0),即为a } //3、判断当前输入是否为1 if(n == 1) { fib = b; // fib为F(1),即为b } //4、判断当前输入是否为>=2 if(n >= 2) { for(long i = 2; i <= n; i++) { fib = a + b; // F(2)=F(0)+F(1) long t = b; // 获取上一项的等式右面的第一项(防止被新值覆盖) b = a + b; // 获取下一项的等式右面的第一项 a = t; // 获取下一项的等式右面的第二项 } } //4、执行打印 System.out.println("第 "+n+" 位的斐波那契数为:"+fib); } }
2)递归实现
import java.util.Scanner; /** * 需求:根据用户的输入n,求n的阶乘(n!=n*(n-1)*(n-2)*2*1) * 分析:1、导入Scanner类所在命名空间,实现接受用户的输入 * 2、根据递归使用的必要条件: * (1)子问题和原问题做同样的事情:求积 * (2)边界条件 * 已知:1!=1 * 假设求 5! * 第一步:5*4! * 转化为求4! 第二步:4*3! * 转化为求3! 第三步:3*2! * 转化为求2! 第三步:2*1! * 因为一直1!=1 所以 2!的可以知道,以此类推得到5!的值 * * (3)从上述的分析中可知:满足递归使用的必要条件,所以使用递归实现 * (4)获取递归三要素: * -- 边界条件(递推条件):1! =1 * -- 递归前进段(n != 1):n * (n-1)! * -- 递归返回段(n == 1):1 * * * 3、实现时,注意异常情况的处理 * * 编码实现:JieChengRecursionDemo类--递归实现 */ public class JieChengRecursionDemo { public static void main(String[] args) { // 1、定义变量 n 接受用户输入 Scanner sc = new Scanner(System.in); System.out.println("请输入正整数n:"); int n = sc.nextInt(); // 2、验证用户输入数字的合法性(是否为正整数) if (n <= 0) { System.out.println("请输入正整数!"); return; } // 3、调用函数jC实现 int jc = jC(n); // 4、输出n的阶乘 System.out.println("n的阶乘是:"+jc); } // 定义实现阶乘的函数 -- Recursion public static int jC(int n) { if(n == 1) { return 1; } return n * jC(n-1); } }
第7&8节:斐波那契的非递归和递归实现
1)非递归实现
/** * 需求:已知 斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2) * 斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、... * 求出第n个斐波那契数 * * 分析: * 1、设F(0)为 a(a=0),设F(1)为b(b=1) * 2、递推得到F(2)=b+a;F(3)=(b+a)+b ..... * 3、总结规律: * n = 0 时 F(0) = a; * n = 1 时 F(1) = b; * * 当n >=2 时 * F(2) = b + a * F(3) = (b+a) + a * ------------------------- * 下一项的等式右面的第一个数 等于上一项的等式右面之和 * 下一项的等式右面的第二个数 等于上一项的等式右面第一项 * * 编码实现:FibForDemo类--注意 n 为负整数的情况 * */ import java.util.Scanner; public class FibForDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个非负整数n:"); long n = sc.nextLong(); // 接收用户的输入 if(n < 0) { System.out.println("请输入一个非负整数!"); return; } long a = 0; // 记录 F(0) long b = 1; // 记录 F(1) //1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义) long fib = -1; //2、判断当前输入是否为0 if(n == 0) { fib = a; // fib为F(0),即为a } //3、判断当前输入是否为1 if(n == 1) { fib = b; // fib为F(1),即为b } //4、判断当前输入是否为>=2 if(n >= 2) { for(long i = 2; i <= n; i++) { fib = a + b; // F(2)=F(0)+F(1) long t = b; // 获取上一项的等式右面的第一项(防止被新值覆盖) b = a + b; // 获取下一项的等式右面的第一项 a = t; // 获取下一项的等式右面的第二项 } } //5、执行打印 System.out.println("第 "+n+" 位的斐波那契数为:"+fib); } }
2)递归实现
/** * 需求:已知 斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2) * 斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、... * 求出第n个斐波那契数 * * 分析:分析过程详细见 递归8.png图片 * * 编码实现:FibRecursionDemo类--注意 n 为负整数的情况 * * 函数实现fib的第n项 */ import java.util.Scanner; public class FibRecursionDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个非负整数n:"); long n = sc.nextLong(); // 接收用户的输入 if(n < 0) { System.out.println("请输入一个非负整数!"); return; } // 函数调用实现fib求解 long fib = fib(n); // 执行打印 System.out.println("第 "+n+" 位的斐波那契数为:"+fib); } // 接受用户输入的非负整数n求解斐波那契数 // 当数字n为负整数时,在main方法中进行异常处理 // 主要是为了让方法专注于特定功能的实现 public static long fib(long n) { // 当 n 为 0、1 时,直接返回 if(n == 0 ) { // 递归返回段1 return 0; } if(n == 1 ) { // 递归返回段2 return 1; } /* 边界条件(递推条件) n >= 2 当 n >= 2 时,进行递归处理 递归前进段 */ return fib(n - 1) + fib(n - 2); } }
相关文章推荐
- java io 装饰设计模式
- JDK 源码 阅读 - 2 - 设计模式 - 创建型模式
- java 数据类型转换
- Eclipse Ndk开发中的Method 'NewStringUTF' could not be resolved问题
- Java基础Map的使用
- Java语言基础1--综合案例(数字加密问题):
- java学习&复习 2015/07/15
- java web系统调优方案
- Java基本语法--变量与常量
- 解析Unicode编码和Java char
- 手工制作的年份Java老A发售量
- 【Java】字符串程序
- byte[]和InputStream的相互转换
- Java基础---JVM内存管理以及垃圾回收机制
- struts中如何将前台的值能在action中获取到
- java web 开发乱码总结
- java取反运算
- Java个人习惯用法总结
- SpringMVC入门
- Spring MVC工作流程图