我正在嘗試撰寫一個代碼,它將遞回地從給定陣列輸出所有可能的密碼,例如給定輸入
"ab"
將輸出下一個:
a
b
aa
ab
ba
bb
問題是我被指示在crack()下面的函式中只使用一個回圈,就是這樣。我不能使用任何其他功能,只有這兩個。
這是我到目前為止所得到的:
import java.util.*;
public class PasswordGen {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a string:");
char array[] = sc.next().toCharArray();
System.out.println("All Combination:");
crack(array);
sc.close();
}
static void crack(char[] array) {
for (int i = 1; i <= array.length; i ) {
generate(array, i, "", array.length);
}
}
static void generate(char[] array, int i, String string, int length) {
//recursion stopping if condition is meet
if (i == 0) {
System.out.println(string);
return;
}
for (int j = 0; j < length; j ) {
String charArray = string array[j];
generate(array, i -1, charArray , length);
}
return;
}
}
有沒有辦法在不使用函式中的for回圈的情況下獲得相同的輸出generate()?(見下面的代碼)。
static void generate(char[] array, int i, String string, int length) {
//recursion stopping if condition is meet
if (i == 0) {
System.out.println(string);
return;
}
for (int j = 0; j < length; j ) {
String charArray = string array[j];
generate(array, i -1, charArray , length);
}
有什么建議/更好的方法嗎?
uj5u.com熱心網友回復:
不確定這是否回答了您的問題,但這里有一個類可以在沒有任何 for 回圈的情況下執行您想要的操作:
import java.util.*;
import java.util.stream.*;
class Bruteforcer {
private List<Integer> state = Collections.singletonList(0);
private final String allowedChars;
private final Integer maxLength;
public Bruteforcer(String allowedChars, Integer maxLength){
assert allowedChars != null;
assert allowedChars.length() > 0;
assert maxLength > 0;
this.allowedChars = allowedChars;
this.maxLength = maxLength;
}
public String next(){
final var allIndexesAreLastChar = this.state.stream().allMatch(i -> i == this.allowedChars.length() - 1);
final var currentLength = this.state.size();
if (currentLength > this.maxLength){
return null;
}
final var nextPassword = this.state.stream()
.map(i -> this.allowedChars.substring(i, i 1))
.collect(Collectors.joining(""));
if (allIndexesAreLastChar){
this.state = Collections.nCopies(currentLength 1, 0);
return nextPassword;
}
this.state = IntStream.range(0, currentLength)
.mapToObj(i -> {
final var current = this.state.get(currentLength - 1 - i);
final var mustIncrement = i == 0 || this.state.get(currentLength - i) == this.allowedChars.length() - 1;
if (mustIncrement){
return current == this.allowedChars.length() - 1 ? 0 : current 1;
}
return current;
})
.collect(Collectors.toList());
Collections.reverse(this.state);
return nextPassword;
}
}
class FindPasswordApplication {
public static void main(String[] args) {
final var bruteforcer = new Bruteforcer("ab", 2);
for (var i = 0; i < 10; i ){
final var password = bruteforcer.next();
System.out.println(password);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/489052.html
下一篇:子sql的父平均值-遞回
