Rekurencyjne podanie wszystkich możliwości tablicy znaków

0

Witam!

Ostatnio staram się z zrozumieć podstawowe programy wykorzystujące algorytm typu brute force i potrzebuję waszej pomocy.
Chcę stworzyć metodę, która wypisze mi wszystkie możliwe wyrażenia, które można stworzyć korzystając z podanej tablicy znaków. Wiem jak to zrobić korzystając z pętli for, lecz jest ona nieelastyczna względem długości poszukiwanej wartości. Moim zadaniem jest stworzyć metodę rekurencyjną, która będzie przyjmowała długość hasła oraz tablicę dostępnych znaków.

W internecie jest parę przykładów (osobiście piszę w Javie), jednak nie wyczyn skopiować to, co ktoś napisał. Ja chcę zrozumieć sposób tworzenia takiej metody oraz jej działanie krok po kroku.

Przykład

Długość wyrażenia: 3 znaki.
Tablica znaków: {a, b, c}

Wynik:
a, a, a
a, a, b
a, a, c
a, b, a
a, b, b
a, b, c
a, c, a
a, c, b
a, c, c
b, a, a
b, a, b
b, a, c
b, b, a
b, b, b
b, b, c
b, c, a
b, c, b
b, c, c
c, a, a
c, a, b
c, a, c
c, b, a
c, b, b
c, b, c
c, c, a
c, c, b
c, c, c

Ze względu na mój oporny umysł poproszę o najłatwiejsze przedstawienie problemu - rozbicie go na najmniejsze części, aby łatwiej było mi go przyswoić.

Oto co znalazłem w internecie, za ewentualny duplikat przepraszam.

http://4programmers.net/Forum/Newbie/160002-metoda_brute_force_-_jak_polaczyc_sie_z_interfejsem?p=1024509#id1024509
http://stackoverflow.com/questions/14094864/explain-brute-force-algorithm
[algorytmika] Permutacje
Permutacje. Sprawdzenie

0

hydra, johny, hashcat ... itd się fochneły?

Napisz to w C/C++ dla jakiejś względnej wydajności.
Algorytm bute'a to nic trudnego nie rozumiem co tutaj można nie rozumieć.
Podstawiasz wartości do tablicy, wedle kolejności, można tego "dokonać", bez rekurencji na dowolną ilość znaków.
Wartości określasz na początku ustalasz im np indeksy (albo lecisz po kodach ASCII), generujesz haselko i je albo hashujesz (potem cmp hash), albo wpisujesz gdzie się należy.

Zasada taka sama jak z liczeniem do 1 000 000 (dla wilekości hasla 6-znakowego), z tym że podstawiasz pod cyferki swoje znaczki.

0

Okej zapytam inaczej. Jak kod, który podaję poniżej przekształcić na kod, który będzie tworzył wszystkie możliwości bez pętli for.
Super by było, gdyby ktoś to napisał w pseudokodzie. Ewentualnie w Javie lub Pythonie, innego języka nie zrozumiem.

Pozdrawiam.

1
import java.util.*;
import java.lang.*;
import java.io.*;

public class Main
{
	private static boolean allCharactersAreAlreadyPutInArray(int position, char[] array){
		return position >= array.length;
	}
	
	private static void putCharcterInArrayAtPosition(char character, char[] array, int position){
		array[position] = character;
	}
	
	private static void printArray(char[] array){
		for(char character : array){
			System.out.print(character);
		}
		System.out.println();
	}
	
	public static void putCharacterAtPositionInArrayAndGenerateRest(int position, char[] array){
		if(allCharactersAreAlreadyPutInArray(position, array)){
			printArray(array);
			return;
		}
		
		for(char characterToPutAtPosition = 'a'; characterToPutAtPosition <= 'c'; ++characterToPutAtPosition){
			putCharcterInArrayAtPosition(characterToPutAtPosition, array, position);
			int nextPosition = position + 1;
			putCharacterAtPositionInArrayAndGenerateRest(nextPosition, array);
		}
	}
	
	public static void generateCombinations(char[] array){
		putCharacterAtPositionInArrayAndGenerateRest(0, array);
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		// Generate combinations of length 3 (array of 3 elements)
		generateCombinations(new char[3]);
	}
}

Masz kod generujący kombinacje ze stałego zestawu znaków, rozszerz go jak chcesz i czytaj, aż zrozumiesz. A jak nie zrozumiesz, to napisz, co jest nieczytelne. Kod jest celowo napisany tak topornie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1