java程序员从笨鸟到菜鸟之(十七)练习题
来源:互联网 发布:知乎招商银行上分 编辑:程序博客网 时间:2024/06/10 22:49
1 递归
递归算法:在运行中不断调用自身;
理解:以参数的不同,把每次调用看成是调用不同的算法模块
构造方法不能使用递归
举一个n!的例子,看看算法是怎样执行的?
实例1:
package 测试集;public class Demo2 {public static void main(String[] args) {/* 补充:构造方法不能使用递归 * public StringDemo(){StringDemo();*//** * *递归:方法嵌套 * *方法递归:方法调用本身的一种现象 * *三个条件: * 1)需要定义个方法 * 2)方法必须有出口条件 * 3)必须有某一种规律 * *//*需求:求5的阶乘 5! = 5 * 4 * 3 * 2 * 1 ; 5! = 5 * 4! ;*//** * 1)明确返回值类型:int类型 * 参数类型:int类型的值 * * 2)出口条件: * if(n==1){ * return 1 ; * } * * 3)要有规律 * if(n!=1){ * return n* 方法名(n-1); * } * */ //举例:n!public static int factory(int n){if(n==1||n==0){return 1 ;}else{return n* factory(n-1) ; //5 * 4 * 3 * 2 *1}}}上述算法如何执行的?以n=3为例:
factory(3)→factory(2)→factory(1)-factory(2)→factory(2)→factory(3)
分两步:递归和回溯
说明:满足停止条件(即:递归到factory(1)),停止递归,开始回溯返回调用算法)并计算,从factory(1)返回到factory(2),计算2*factory(1)=2返回到factory(3);计算3*factory(2)=6结束递归。
特点:和一般的方法调用一样,算法的起始模块通常也是终止模块,通过参数值将"同一模块"的"不同次运行"进行区别后,理解递归函数执行过程!
实例2:
package 测试集;import java.util.Scanner;/* 1:兔子生育:一对兔子(刚出生),从出生后第三个月起每个月都生一对兔子,小兔子长到三个月后每个月又生一对兔子,假如兔子不死,问12个月后兔子的对数分析:月份(后): 1 2 3 4 5 6 兔子对数: 1 1 1+1(生) 1+1(生)+1(生) 1+1(生)+1(生)+2(生) 1+1(生)+1(生)+2(生)+3(生) ...... 共: 1 1 2 3 5 8 规律:假设第n-2个月后的兔子为a[n-2]; 第n-1月后的兔子为a[n-1]; 则第n个月后兔子为a[n]=a[n-1]+a[n-2] 哎!这算不算近亲结婚!!!是不是有点像斐波那契数列? 注意:尽量选最大的类型(long int),以免数据溢出;这里只是简单测试选了int类型 */public class Demo2 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入月份:");int month=sc.nextInt();int rabitNum=rabitBrith(month);System.out.println(month+"个月后兔子数量"+rabitNum);}public static int rabitBrith(int n){ //方法定义if(n==1||n==2){return 1 ; //出口条件}else{return rabitBrith(n-1)+rabitBrith(n-2) ; //规律}}}
实例3:查询字符串的个数
package 测试集;import java.util.Scanner;public class Demo11 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输出待查询的字符串:");StringBuffer s=new StringBuffer(sc.nextLine());//待查询字符串内容:woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagunSystem.out.println("需要查询的字符串:");String s1=sc.nextLine();//需要查询:java;int count=0;while(s.indexOf(s1)!=-1){count++;s.delete(s.indexOf(s1),s.indexOf(s1)+s1.length());}System.out.println("输入的字符串含java的个数:"+count);}}
实例4:二分查找
package 测试2;/* * 二分查找: * 思想:就是将查找的键和子数组的中间键作比较; * 如果被查找的键小于中间键,就在左子数组继续查找; * 如果大于中间键,就在右子数组中查找; * 否则中间键就是要找的元素; * java设计:参数为数组(待查询)、键值(目标) * 设计:如果未查询到该值,则返回:-1 * 如果查到,返回该索引 * 分析:由于每次查询后,范围缩小,多次查询(循环) * 注意:循环结束条件 * * */public class Demo {public static void main(String[] args) {int[] arr = { 13, 24, 57, 69, 80 };// 数组静态初始化方式System.out.println("二分法的结果:" + rank(arr, 24));// 查询到的情况System.out.println("二分法的结果:" + rank(arr, 34));// 未查询到的情况}// 定义一个功能:二分查找(循环查找)public static int rank(int[] arr, int key) {int star = 0; // 起始int end = arr.length - 1; // 终止while (star <= end) { // 查找的结果:1)有此值 2)无此值int mid = star + (end - star) / 2;// 中间值(下一次循环与键值进行比较)if (arr[mid] > key) { // 中间值大于目标值,所以键值可能在左边;重新定义查找范围end = mid - 1;} else if (arr[mid] < key) { // 中间值小于目标值,所以键值可能在右边;重新定义查找范围star = mid + 1;} else { // 被查询到return mid; // 查询到返回索引}}return -1; // 如果没有查询到,此时(star>end),跳出while循环;返回值:-1}}
阅读全文
0 1
- java程序员从笨鸟到菜鸟之(十七)练习题
- java程序员从笨鸟到菜鸟之练习题(七)(补充)
- java程序员从笨鸟到菜鸟之(十五)StringBuffer类练习题
- Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
- Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
- Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
- java程序员从笨鸟到菜鸟之(二十七)集合之Jdk5以后新特性
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- java程序员从笨鸟到菜鸟之(十一)练习题(多态)和API文档的制作
- Java程序员从笨鸟到菜鸟之(六十九)细谈Hibernate(十七)Hibernate实现分页和综合查询详解
- JAVA程序员从笨鸟到菜鸟
- java程序员从笨鸟到菜鸟之(三十三)异常之浅谈
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- MySql--三种注释写法
- 用汇编获取系统开机的elapsed时间,制作随便数
- Android 开发小知识
- 动态链表实现多项式
- 计算日期是否为最近几天
- java程序员从笨鸟到菜鸟之(十七)练习题
- ios开发中的一些小技巧
- LeetCode
- Spring-MVC 注解配置
- 解决a标签hover在移动设备点击两次才跳转
- 科普:小米松果澎湃S1的前世今生以及真实性能
- linux检测题
- java.lang.AbstractMethodError: org.testng.remote.support.RemoteTestNG6_10$De
- c# onclientclick和onclick区别