-
生成一个长度是3的随机字符串,把这个字符串作为当做密码
-
使用穷举法生成长度是3个字符串,匹配上述生成的密码
要求: 分别使用多层for循环 和 递归解决上述问题
1.穷举法:
穷举算法,依赖计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的,也叫枚举法、暴力破解法。
基本思想———逐一列举问题所涉及的所有情形,并根据问题提出的条件进行检验从而找到可能的解 。
方法步骤———确定枚举对象、枚举范围、判断条件;循环验证每一个解
2.递归:
递归的思想:
以此类推是递归的基本思想。
具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
递归的两个条件:
可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)
存在一种简单情境,可以使递归在简单情境下退出。(递归出口)
递归三要素:
一定有一种可以退出程序的情况;
总是在尝试将一个问题化简到更小的规模
父问题与子问题不能有重叠的部分
递归:自已(方法)调用自已
例子:用递归把目录下所有的目录及文件全部显示出来
方法一:多层循环方式
package day6;
/*
* 练习-穷举法破解密码
* 1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码
2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码
要求: 分别使用多层for循环 和 递归解决上述问题
*/
public class TestNumber10 {
public static void main(String[] args) {
//多层循环方式
String password=randomString(3);//首先通过调用randomString()方法随机生成一个字符串作为密码,并将它赋值给password
System.out.println("密码是:"+password);//输出这个密码
char[]guesspassword=new char[3];//新建一个长度为3的空数组
outloop://设置一个标签,在break的时候使用该标签,即能达到结束多重嵌套循环的效果
//开始多层循环,也就是穷举
for(short i ='0';i<='z';i++){
for(short j ='0';j<='z';j++){
for(short k ='0';k<='z';k++){
if(!isLetterOrDigit(i,j,k)){
//调用isLetterOrDigt()方法,如果i,j,k有一个不符合条件,就跳出当前循环,并开始下一次循环
continue;
}
//如果i,j,k都符合条件,那就分别把i,j,k赋值给guesspassword数组的三个位置
guesspassword[0]=(char)i;
guesspassword[<