arranjos java

Beware

What is folding?
Boas pessoal, mais uma vez venho aqui para vos solicitar um pouco do vosso conecimento!!!

Tenho um problema onde pretendem que eu implemente uma função em que, dado um certo número de digitos decimais (isto é, de 0 a 9), este me escreva todas os arranjos (com repetição) possiveis.

Supostamente, para facilitar, terei de recorrer á recursividade, porém, não consigo nem por nada pô-lo a funcionar.

Supostamente o procedimento é:

Dado o número de dígitos "n", criar um array constante com "n" dígitos, isto é, se forem 5 digitos cria-se um array com os dígitos 0, 1, 2, 3 e 4. Seguidamente noutro array, pega-se no array anterior e faz-se todos os arranjos completos possiveis e será aqui que se recorre á recursividade (para preencher este último array), mas como?

Alguém tem umas dicas?

Abraço
 
Pessoal, ninguém consegue dar uma força??

Eu só preciso mesmo de uma ajuda adicional, porque nao estou a ver mesmo por onde começar...

Se não perceberem o problema digam alguma coisa !!!

Abraço
 
Ou seja estamos a falar de uma potência normalíssima correcto??

Ou seja para por exemplo um número 4 irás ter

4^0, 4^1, 4^2, 4^3

Sendo essa a solução?
 
Não percebi bem o que queres dizer, mas o meu problema nao é achar a solução em número inteiro, mas sim em gerar os arranjos com repetição... Por exemplo, para o conjunto {0,1,2}, para gerar arranjos ordenados 2 a 2, então fica:

3^2 = 9;

{0,0}
{0,1}
{0,2}

{1,0}
{1,1}
{1,2}

{2,0}
{2,1}
{2,2}

Isto, porque é possivel haver repetições!!! Já consegui resolver um problema igualzinho, mas com permutações, mas para este, não estou a conseguir mesmo nada...

Espero ter sido claro.
Abraço
 
Boas!

Bem demorou mas cá vai.

eu penso que a ideia é teres algo assim

funcao(n, k, array)

que se vai chamar k vezes.

ora, na primeira interação irás ter

funcao(3,2,List<List<int>> LISTA) -> a lista é vazia e terá tamanho 3

precorres o tal array (0,1,2)

e para cada posição deste crias uma nova lista dentro da LISTA pegando no que já lá estava (agora nada!) e acrescentando i

i = 0 ------> [[0]]
i = 1 ------> [[0][1]]
i = 2 ------> [[0][1][2]] -> NOVALISTA

e por fim chamarás funcao(3,2-1,NOVALISTA)

i = 0 ------> [[00]]
[[00][01]]
[[00][01][02]]
i = 1 ------> [[00][01][02][10]]
[[00][01][02][10][11]]
[[00][01][02][10][11][12]]
i = 2 ------> [[00][01][02][10][11][12][20]]
[[00][01][02][10][11][12][20][21]]
[[00][01][02][10][11][12][20][21][22]] ---> NOVALISTA



ou seja, irás ter três fors.

um para precorrer a lista(geral) que recebes, outro para precorreres o array. para cada posição do array, crias uma lista(valor) com o que está no array e o resto do que estava na lista(valor) antiga (o 3o for)

este exercicio é terrivel para se fazer em java =\ não sei se existe o concat de listas, se existir nao necessitas do ultimo for, basta criares uma lista(por exemplo [0]) e fazeres concat com o resto que estava ([0] concat [0] = [00]
 
Bom, eu consegui agora concluir o meu programa... Fui a umas OT´s e com jeitinho, consegui o meu programa.... Para não deixar a thread em "branco" e por respeito ás pessoas que se disponibilizaram a ajudar, neste caso arpinacio, a quem eu realmente agradeço, resolvi deixar aqui a minha solução (com uma grande ajuda do professor)!;)

Código:
  static void arranjosComRepeticao(final String[] alfabeto,String[] lista, 
    int n,int k) 
  { 
    if (k == 0) 
      escreve(lista); 
    else 
    { 
      for(int i = 0 ; i < n ; i++) 
      { 
        lista
[lista.length - k] = alfabeto[i]; 
        arranjosComRepeticao(alfabeto,lista,n,k-1); 
      } 
    } 
  } 
 
  static void escreve(String[] lista) 
  { 
    for(int i = 0;i < lista.length;i++) 
    { 
      if (i > 0) 
        out.print(" "); 
      out.print(lista[i]); 
    } 
    if (lista.length > 0) 
      out.println(); 
  } 
}

Em principio, estas duas funções são suficientes... Pelo menos aqui foi. :p
Obrigado mais uma vez.
Abraço
 
Boas... está aqui o programa feitinho... ja agora tenho tambem para fazer as permutações... ou seja sao arranjos sem repetições.... basta por isso implementar uma funçao em que retires os casos em que existem numeros repetidos... se quiseres isso avisa...

Já agora este programa esta desenhado para correr atraves da consola de linux(neste caso unbuntu)...

caso tenhas o linux colocas este programa na tua pasta pessoal ( para evitar complicaçoes) e depois abres o Terminal/consola e escreves:

javac a4e1.java
java a4e1 n ---> em que n é o numero de arranjos... ou seja se o n for 2 escreve 00 01 02 03... 10 11 12 13... ate 99...

Alguma duvida pergunta

Código:
import static java.lang.System.*;

public class a4e1
{
    public static void main(String[] args)
    {
        String dic;
        int k;
        dic = "0123456789";

        k = Integer.parseInt(args[0]);

        arranjos(dic, k, "");
    }

    static void arranjos(String dic, int k, String arranjo)
    {

        if (k==0)
            out.println(arranjo);
        else
            for (int i=0; i< dic.length(); i++)
            {

                    arranjos(dic,k-1, arranjo + dic.charAt(i) );
            }

    }
}
 
Última edição:
Back
Topo