[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
calcular permutações usando bash
From: |
Tiago Barcellos Peczenyj |
Subject: |
calcular permutações usando bash |
Date: |
Fri, 3 Feb 2006 19:30:14 -0200 |
eu, sem muito o que fazer, peguei um problema de encontrar permutações
de valores com bash, segue o exemplo:
#!/bin/bash
a=(0 1 2)
permut(){
local j
if [ "$#" -eq "${#a[@]}" ]
then echo $@
else for j in $( echo ${a[@]} | tr ' ' '\n' | grep -v -f<(echo $@ | tr
' ' '\n') )
do permut $@ $j
done
fi
}
for i in ${a[@]}
do permut $i
done
exit 0
Segue explicação maluca:
Forma: Recursiva
Se vc tem um vetor A de X posições, o que vc pode fazer é : fazer um
laço percorrendo todos os elementos do vetor, passando como argumento
para uma função recursiva, exemplo .
A = [ 0 1 2 ]
funcao 0
funcao 1
funcao 2
Este é o primeiro passo. O que esta funcao faz ? um outro laco. so que
agora chamando ela mesmo com 2 argumentos ! o original e mais outro...
veja só :
funcao 0 1
funcao 0 2
humm como assim ? ora, se a funcao recebe um argumento Z qualquer, ela
faz um laço, pegando todos os elementos do vetor diferentes de Z. no
caso de 0, sao o 1 e 2.
Ta mais pq ? ora... vc ta montando as permutacoes. veja agora a
jogada: vc chamou a funcao 0 2, logo ela tem que fazer um laco entre
todos os valores diferentes de 0 e 2 sendo passados como terceito
argumento !
funcao 0 2 1
funcao 0 2 3
...
funcao 0 2 9
ou seja, vc faz um laço com o que vc nao fornece pra funcao, ai ela
vai se replicando... replicando...
bueno e ai ? ai que quando ela tiver 10 valores como argumento, não
tem que fazer laço nenhum, tem que imprimir o resultado na tela !
o for em j de dentro da permut faz o seguinte
echo ${a[@]} | tr ' ' '\n' | grep -v -f<(echo $@ | tr ' ' '\n')
bah q troço bizarro... mas acompanha comigo
${a[@]} são todos os elementos do vetor a
$@ são todos os argumentos que permut recebe
essa maluquice com echo, tr e grep -v serve pra pegar todos os
elementos de 'a' que não foram encontrados nos parametros da funcao.
pega um terminal unix e manda esse bichinho rodar pra tu ver...
MAS PRA 10 É muito lento !!!
segue um pedaço do que ele ta calculando agora:
0 1 2 8 6 5 9 3 4 7
0 1 2 8 6 5 9 3 7 4
0 1 2 8 6 5 9 4 3 7
0 1 2 8 6 5 9 4 7 3
0 1 2 8 6 5 9 7 3 4
0 1 2 8 6 5 9 7 4 3
0 1 2 8 6 7 3 4 5 9
0 1 2 8 6 7 3 4 9 5
0 1 2 8 6 7 3 5 4 9
0 1 2 8 6 7 3 5 9 4
0 1 2 8 6 7 3 9 4 5
0 1 2 8 6 7 3 9 5 4
0 1 2 8 6 7 4 3 5 9
0 1 2 8 6 7 4 3 9 5
0 1 2 8 6 7 4 5 3 9
0 1 2 8 6 7 4 5 9 3
0 1 2 8 6 7 4 9 3 5
0 1 2 8 6 7 4 9 5 3
tem outras formas de fazer ? obvio... mas teste é um algoritmo que funfa...
Desculpem a forma esquizofrenica de explicar... mas estou semi
empolgado. alias devem existir outras formas de fazer estas coisas em
bash ;-)
--
Tiago B Peczenyj
Linux User #405772
echo 435991959574767208964049173891616024402182829083447460457482P | dc
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- calcular permutações usando bash,
Tiago Barcellos Peczenyj <=