Erro uninitialized value em subrotina

1. Erro uninitialized value em subrotina

camilo lima
camilolima

(usa Ubuntu)

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


  


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

Fernando Ventura Pires Junior
fventurajr

(usa Ubuntu)

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);







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts