Recursividade em Shell - Problemas na transcrição de código Java para Shell

1. Recursividade em Shell - Problemas na transcrição de código Java para Shell

José Augusto
gutohardance

(usa Ubuntu)

Enviado em 25/07/2016 - 20:10h

Boa noite

Sou Analista/Desenvolvedor a alguns anos e trabalho essencialmente com a linguagem Java, porém me interesso por linux também já a muito tempo, mas ainda não havia desenvolvido nenhum trabalho na área, coisa que mudou, devido a nova vertente de desenvolvimento que encontro no momento.

Estou tentando transcrever um código Java para o Shell Script, porém encontro alguns problemas, acredito eu ter implementando todas as peculiaridades do Java de forma correta no Shell Script, porém depois de vários debugs nas duas linguagens, suspeito que o Shell Script não ofereça bom suporte a Recursividade, consulto o fórum para saber sobre o assunto.

Os Script a serem desenvolvidos tem o objetivo de a partir de uma palavra informada como parâmetro montar um anagrama dessa palavra, ou seja, fazer todas as combinações possíveis entre suas letras, uma pratica comum para se montar um dicionário de senhas.

Pelo que notei, a recursividade do Shell Script quando atinge seu último nível, não continua a execução do primeiro. Alguém consegue confirmar minha suspeita ?

Programa em Java:

public class Anagrama {

public static void main(String[] args) {
String palavra = args[0].toString();
imprimeAnagramas("", palavra);
}

public static void imprimeAnagramas(String prefix, String word) {
if (word.length() <= 1) {
System.out.println(prefix + word);
} else {
for (int i = 0; i < word.length(); i++) {
String cur = word.substring(i, i + 1);
String before = word.substring(0, i);
String after = word.substring(i + 1);
imprimeAnagramas(prefix + cur, before + after);
}
}
}
}


Transcrição feita por mim, para Shell Script

#!/bin/bash

imprimeAnagrama() {

prefixo=$1
palavra=$2

if [ ${#palavra} -le 1 ]
then
echo $prefixo""$palavra
else
i=1
while [ $i -lt ${#palavra} ]
do
anteriorI=$(($i-1))
proximoI=$(($i+1))
corte=$(expr substr $palavra $i $i)
anterior=$(expr substr $palavra 1 $anteriorI)
depois=$(expr substr $palavra $proximoI ${#palavra})
((i++))
imprimeAnagrama $prefixo""$corte $anterior""$depois
done
fi

}

imprimeAnagrama "" $1



Espero que alguém possa me ajudar com esse problema, e propor um solução eficaz em Shell Script e/ou também informar sobre demais peculiaridades do Shell Script que impedem esta solução, desta forma.


  


2. Re: Recursividade em Shell - Problemas na transcrição de código Java para Shell

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/07/2016 - 13:30h

gutohardance escreveu:
Boa noite

Sou Analista/Desenvolvedor a alguns anos e trabalho essencialmente com a linguagem Java, porém me interesso por linux também já a muito tempo, mas ainda não havia desenvolvido nenhum trabalho na área, coisa que mudou, devido a nova vertente de desenvolvimento que encontro no momento.
Estou tentando transcrever um código Java para o Shell Script, porém encontro alguns problemas, acredito eu ter implementando todas as peculiaridades do Java de forma correta no Shell Script, porém depois de vários debugs nas duas linguagens, suspeito que o Shell Script não ofereça bom suporte a Recursividade, consulto o fórum para saber sobre o assunto.

Os Script a serem desenvolvidos tem o objetivo de a partir de uma palavra informada como parâmetro montar um anagrama dessa palavra, ou seja, fazer todas as combinações possíveis entre suas letras, uma pratica comum para se montar um dicionário de senhas.

Pelo que notei, a recursividade do Shell Script quando atinge seu último nível, não continua a execução do primeiro. Alguém consegue confirmar minha suspeita ?
Transcrição feita por mim, para Shell Script

#!/bin/bash
imprimeAnagrama() {
local prefixo=$1
local palavra=$2

if [ ${#palavra} -le 1 ]
then
echo $prefixo""$palavra
else
[ $i ] || { i=1 ; export i ; }
while [ $i -lt ${#palavra} ]
do
anteriorI=$(($i-1))
proximoI=$(($i+1))
corte=$(expr substr $palavra $i 1)
anterior=$(expr substr $palavra 1 $anteriorI)
depois=$(expr substr $palavra $proximoI ${#palavra})
i=$((i+1))
imprimeAnagrama $prefixo""$corte $anterior""$depois
done
fi

}

imprimeAnagrama "" $1


Espero que alguém possa me ajudar com esse problema, e propor um solução eficaz em Shell Script e/ou também informar sobre demais peculiaridades do Shell Script que impedem esta solução, desta forma.

___________________________________________
Boa tarde gutohardance.
Peculiaridades:
Defina prefixo=$1 e palavra=$2, como variável "local"

Correções:
Só "ecoa" se o tamanho da palavra é <= 1?

Do modo que está, a var "i", será sempre "1".
Sugestão:
[ $i ] || { i=1 ; export i ; } 

Desta forma, só é atribuído "1" se $i for vazia.

Para acrescentar 1 em "$i"
Faça:*
let i++
Ou
i=$((i+1))
* Existem mais opções . . .

Variável "corte", se a intenção é "pegar" somente um caractere . . .
corte=$(expr substr $palavra $i 1)
O mesmo se aplica para a variável "anterior", com a ressalva: "$i>=2"
Variável "depois", é para "pegar" o restante da palavra?

Por enquanto, são essas as observações, ainda não consegui o resultado esperado . . .

Montei um bem simples, segue:

#!/bin/bash
#set -x #debug mode
NN="$1"

COMBINA() {
local ANTERIOR=$1
local CNTL=$(($2-1))
for X in {0..9};do
awk -F" " 'length($0)=='$NN' {printf "%s\n" ,$0}' <<< "$ANTERIOR$X"
(($CNTL>0)) && COMBINA $ANTERIOR$X $CNTL
done
}
COMBINA "" $1


OBS.: Os caracteres são definidos na var "X"
Uso: script.sh N, onde "N" é o nº de caracteres.

Att.:
Marcelo Oliver







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts