Pular para o conteúdo

Erro uninitialized value em subrotina

Responder tópico
  • Denunciar
  • Indicar

1. Erro uninitialized value em subrotina

Enviado em 17/08/2019 - 00:43h

Boa noite,

Estou tentando implementar um script em perl que realiza o calculo de Fibonacci, a partir de duas variáveis

use warnings;
# Definindo a subrotina
sub fib {
my @list1 = @_;
my $number = $list1[0];
my $val = $list1[1];

if ($number == 0 or $number == 1) {
return $number;
}
my $x =fib($number-1);
my $y =fib($number-2)*$val;
my $z =$x+$y;
return $z; # chamando a recursividade
}

# passando a lista
@Lista = (5, 3);
# Chamando a subrotina com os parametros
print fib(@Lista), "\n";

No entanto, o seguinte erro aparece:
"Use of uninitialized value $val in multiplication (*) at teste_subroutina.pl line 13"

Eu sei que o resultado esperado é 19, porém esse valor somente é obtido quando altero manualmente o $val por 3 diretamente na subrotina. Contudo, como esse parametro pode varia de 1 até 5, alterar manualmente não seria a melhor solução para o caso.

Pesquisando sobre o erro, vi que o valor de $val não está sendo lido, ou seja, indefinido. Alguém teria uma dica?

Saudações

Camilo

Responder tópico

2. Falta de inicialização de variáveis globais

Enviado em 14/11/2019 - 10:00h

Bom dia, camilolima

Acho que ficou faltando você declarar as varáveis de forma global fora da sub fib:

my @list1 = ();
my $number = 0;
my $val = 0;

sub fib() {
...
}


Mas de qualquer forma, acho que tem um problema no seu algoritmo, porque você chama duas vezes a recursividade em vez de uma e além disso é uma função que recebe dois parâmetros e você passa apenas um nessas duas chamadas.

chamando duas vezes:
my $x = fib($number - 1);
my $y = fib($number - 2);


Chamando com um parâmetro, passando uma lista
fib(@Lista)
Chamando com um parâmetro passando um escalar
fib($number - 1);

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder