/ / Misterioso "valor sin inicializar en una matriz" en algoritmo para desafío de Perl - Perl, inicialización

Misterioso "valor no inicializado en una matriz" en algoritmo para Perl challenge - perl, inicialización

Actualmente aprendiendo Perl, y tratando de resolver unUn pequeño desafío para encontrar la suma de términos pares de los primeros 4,000,000 términos de Fibonacci. He creado una matriz de Fibonacci que parece funcionar, y luego probé diferentes métodos para descartar los términos de valor impar, y continuamente encuentro un error al intentar sumar mi matriz resultante, obteniendo informes de:

Use of uninitialized value in addition (+) at prob2_3.plx line 23

Esto es lo que tengo:

#!/usr/bin/perl -w
# prob2_2.plx
use warnings;
use strict;

my @fib; my $i; my $t; my $n;
@fib = (1, 2);



for ($i=2; $i<4000000; $i++)  {
my $new= ( $fib[$i-1] + $fib[$i-2] );
push @fib, $new;}


for ($t=3; $t<4000000; $t++)  {
if (($fib[$t] % 2) != 0 ) {
delete $fib[$t];  }  }

my $total = 0;

for ($n=1; $n<$#fib; $n++) {
$total += $fib[($n+1)];}

print  $total;

Respuestas

3 para la respuesta № 1

La advertencia significa que estás agregando undef a algo. delete $fib[$t]; es una mala manera de hacer $fib[$t] = undef;, que luego añades a $total.


Tienes al menos otro error:

Los primeros dos Números de fibonacci son 0 y 1, no 1 y 2.


Tienes un problema importante:

El número 4,000,000 de Fib será extremadamente grande, demasiado grande para un doble.

Para fines de referencia,

10,000th tiene 2090 dígitos: 2079360823713349807211264898864283682508703609401590311968294586652850142345568664892745603430522651559175734329719015801062479426725097317613381017990273803823178974834623555648319143159192453239442002806781032040872441469346284906266838708330804825092065449334087873322637758084744632487379760373479464825811385863155040408101726038120291994389237094285260164739821355447908182359371542956694514931299366484677909043779928477367537928427066017513466483326637769864201210689135579114187277693408080350495679409464829288056605636471818766266897075853738335267742083557415594565854200363476532454100612101244678568917149480326240860269309121160197393822944663604990153196328615969907788042772028923553932967187718291564341907918652511867885682160089752017107049943765706734240087108390881180097625972743182053955425686946081535591845825339823438236043576275982317989611674842426954592463320461413799285081435201873848092358155398899089715146940613169561449778372074346137375621868510685682609069633981 5490921253714537241866911604250597353747823733268178182198509240226955826416016690084749816072843582488613184829905383150180047844353751554201573833105521980998123833253261228689824051777846588461079790807828367132384798451794011076569057522158680378961532160858387223882974380483931929541222100800313580688585002598879566463221427820448492565073106595808837401648996423563386109782045634122467872921845606409174360635618216883812562321664442822952537577492715365321134204530686742435454505103269768144370118494906390254934942358904031509877369722437053383165360388595116980245927935225901537634925654872380877183008301074569444002426436414756905094535072804764684492105680024739914490555904391369218696387092918189246157103450387050229300603241611410707453960080170928277951834763216705242485820801423866526633816082921442883095463259080471819329201710147828025221385656340207489796317663278872207607791034431700112753558813478888727503825389066823098683355695718137867882982111710796422706778536913 192342733364556727928018953989153106047379741280794091639429908796650294603536651238230626

20,000 tiene 4180 dígitos: 1564344347109763849734765364072743458162050946855915883181245417404580803852433819127477934504143316103671237797087184052487157589846395314335101792632666883301188491698850377253383735812017943059782268835280360618754466932406192674904182868594738499500415166599602737300793712012046275485369495600019495004126039595217556097603510836899682827827626851274417838565958464881549888154511565687715162081527027421167926710592169405764372872023265791851279526521097739802047796738013885512616267273220024096214780132567479711643567372517808245262560562426651659391013837988476506124649092538307827326285964637268328029765707984607120961599796336714632362497169952413163370558311283612961033588836334352432860332222878648950508154331165678617373097939647648015552782638392654938551724289386017566932982065441392025369213734676739845068956966278536757235977421127565055467060906533383001625925978595472181091151062798507286798754728450358266089744616465914255799764431508559485853637841082521780322710748029 5460019804609906959990870466177313176084983164281641799671503509393747022018218188953496218589548930610345989543419398509736738709461830797280291056247821618276266613670176736819222576041788101544384620802177944891096783868811538268380758320581911531337040426281564193445169178673697553451356189869176420045215095384362042986181303634013955479331776437601611356383570886490144693580065183004040364311131437779693915842469342458007398091356197445988089776282453099415379284394316086655233088949673106005294984469439336654684063062927629424097860978478752400140363539179281562204466505795140920312543080593149316187266923766409874464592763311969507800636641717511100876446497730582131176406400851005529278784045162794614375038570173989370970426072580596122578783070070020869132109226267607283429012727684089749060079212274462425522613625054717517229065582355337090705481097895199204055216478361641566753047840977824358651656404018971078288591218315211265674466117160770757692570727736979470643298369692 4985238297620234803742588903109002097624069194974216008873335787556184176019479953481549610410690318471391984766225348380613831244057873212285538834884873601821703287701353100465390233569276190098870930279768526550197262821752886655199547952619562650324716407379378738164338836561848863025560089092455251176769098918631685915930643847709745858588982932693819812988495317843741131548671992741215105455172632542174746269812576776198730081274488004812213895374679603848528145208668080980346935047084418437525862081065274599263145907619261379754548677565141069932728908962859358839514253165908393374639966616186359735773529038737616144028073139870303059041095784004759172163511767719049465865825677095260531460468770438883389730044730032249172056972231175687453487114543510159634678745425816587031059271747367091763847515260547444618895808189815039348148497058151990258227187714125159325928248353934579200911789408486043532693868966432238312382363149447035494176703958513348433134246880616790116692805263 8999423311570618981137348891538818027216596300491989181231598151123614651043205656474490923109982595235880446420678700336717534914381729578113169753046083981752465156933790288020841880688083888166659362896648911608716373579944854235997384986302902608821566689026676371268703303207406827737925274781301986480762462594420398637607893961010824979395439225300832931626540179218558345947558472159906873998923767432504278838419479068093778976997276416592421223235719653905071392295735398272851826350645605643470417155719500185143594804374322010189545136205568856276559806316789533450612097900180399440915139647060459321993254566103255011590902408116018722996267956826555434955409390951728022815209412027248353062982911544674007147249326697275010788100666958314965810320432736615962898175585320993128871046552842068867557341007383399180807449030159797672605530835244157256109268527578172314358255179589605335375414082046575557122636364391407861922824529441261003866098066404526541912783214030236752423547997 110159548536582622929575859635210831021463323632502412193578592411823406711689415931679875893320691893633454003945401920111110102014201091414919919149199199321990039454019190000454019920420149102014910914932109

Incluso el 10,000 es demasiado grande para un doble, y el 20,000 es el doble del tamaño del 10,000, ¡así que imagina cuán grande será el 4,000,000!


Cuestiones estilísticas:

my $i; for ($i=2; $i<4000000; $i++)

es mucho más difícil de leer que

for my $i (2..$N-1)

con lo siguiente en la parte superior para evitar tener que repetir el número en todas partes:

my $N = 4_000_000;

0 para la respuesta № 2

Como si el hecho de que el número de Fibonacci 4 millones es más de 10 ^ 835950 no sea un problema lo suficientemente grande, esto no es muy bueno:

for ($t=3; $t<4000000; $t++)  {
if (($fib[$t] % 2) != 0 ) {
delete $fib[$t];  }  }

my $total = 0;

for ($n=1; $n<$#fib; $n++) {
$total += $fib[($n+1)];}

¿Por qué estás caminando por la lista dos veces aquí? Mucho mejor sería combinar los dos bucles en uno. Quieres la suma de los términos impares, así que suma los términos impares. Don "t delete los términos impares (estilísticamente muy malos) y luego repasar la lista de nuevo, confiando en el hecho de que undef tiene un valor numérico de 0 (pero solo con una advertencia).

Y mn, el formato de ese código es muy, muyfeo. Finalmente, escribirá un código que otra persona necesita leer o mantener. Mi lema: imagina que la persona que mantendrá tu código es un psicópata que sabe dónde vives.


0 para la respuesta № 3

Como señala ikegami, su problema no inicializado supone que eliminar elimina elementos de una matriz, cuando en realidad solo los establece en undef (a menos que estén al final de la matriz).

Teniendo en cuenta los requisitos de almacenamiento de los más grandesNúmeros de Fibonacci, no los quiere en una matriz; afortunadamente, no hay necesidad de mantenerlos cerca para este problema. Lo haría así (toma muchos minutos correr):

use strict;
use warnings;
use Math::BigInt "lib" => "GMP";

my $fib_A = Math::BigInt->new(0);
my $fib_B = Math::BigInt->new(1);
my $sum = Math::BigInt->new(0);

# get the next 3999998
for (1..(4000000-2)) {
my $next = $fib_A + $fib_B;
$sum += $next if $next % 2 == 0;
($fib_A, $fib_B) = ($fib_B, $next);
}

print "The sum is $sumn";