/ पर्ल चैलेंज के लिए एल्गोरिथ्म में रहस्यमय "एक सरणी में अनइंस्टॉलिज्ड वैल्यू" - पर्ल, इनिशियलाइज़ेशन

पर्ल चुनौती के लिए एल्गोरिदम में रहस्यमय "एक सरणी में अनियमित मूल्य" - perl, प्रारंभिकरण

वर्तमान में पर्ल सीखना, और हल करने की कोशिश करना एपहले 4,000,000 फिबोनाची शब्दों से भी शब्द की राशि खोजने के लिए थोड़ी चुनौती। मैंने एक फाइबोनैचि सरणी बनाई है जो काम करने लगती है, और फिर विषम-मूल्यवान शब्दों को बाहर निकालने के लिए अलग-अलग तरीकों की कोशिश की, और मेरे परिणामी सरणी को योग करने की कोशिश करते समय लगातार एक त्रुटि में चला जाता है, की रिपोर्ट प्राप्त कर रहा है:

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

यही सब कुछ मेरे पास है:

#!/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;

उत्तर:

जवाब के लिए 3 № 1

चेतावनी का मतलब है कि आप जोड़ रहे हैं undef किसी चीज़ के लिए। delete $fib[$t]; करने का एक बुरा तरीका है $fib[$t] = undef;, जिसे आप बाद में जोड़ते हैं $total.


आपके पास कम से कम एक और त्रुटि है:

पहले दो फाइबोनैकी संख्याएं 0 और 1 हैं, 1 और 2 नहीं।


आपको एक बड़ी समस्या है:

4,000,000 वीं फ़िब संख्या बहुत बड़ी होने वाली है, एक डबल में फिट होने के लिए बहुत बड़ी है।

संदर्भ उद्देश्यों के लिए,

10,000 वें में 2090 अंक हैं: 2079360823713349807211264898864283682508703609401590311968294586652850142345568664892745603430522651559175734329719015801062479426725097317613381017990273803823178974834623555648319143159192453239442002806781032040872441469346284906266838708330804825092065449334087873322637758084744632487379760373479464825811385863155040408101726038120291994389237094285260164739821355447908182359371542956694514931299366484677909043779928477367537928427066017513466483326637769864201210689135579114187277693408080350495679409464829288056605636471818766266897075853738335267742083557415594565854200363476532454100612101244678568917149480326240860269309121160197393822944663604990153196328615969907788042772028923553932967187718291564341907918652511867885682160089752017107049943765706734240087108390881180097625972743182053955425686946081535591845825339823438236043576275982317989611674842426954592463320461413799285081435201873848092358155398899089715146940613169561449778372074346137375621868510685682609069633981 5490921253714537241866911604250597353747823733268178182198509240226955826416016690084749816072843582488613184829905383150180047844353751554201573833105521980998123833253261228689824051777846588461079790807828367132384798451794011076569057522158680378961532160858387223882974380483931929541222100800313580688585002598879566463221427820448492565073106595808837401648996423563386109782045634122467872921845606409174360635618216883812562321664442822952537577492715365321134204530686742435454505103269768144370118494906390254934942358904031509877369722437053383165360388595116980245927935225901537634925654872380877183008301074569444002426436414756905094535072804764684492105680024739914490555904391369218696387092918189246157103450387050229300603241611410707453960080170928277951834763216705242485820801423866526633816082921442883095463259080471819329201710147828025221385656340207489796317663278872207607791034431700112753558813478888727503825389066823098683355695718137867882982111710796422706778536913 192342733364556727928018953989153106047379741280794091639429908796650294603536651238230626

20,000 वें में 4180 अंक हैं: 1564344347109763849734765364072743458162050946855915883181245417404580803852433819127477934504143316103671237797087184052487157589846395314335101792632666883301188491698850377253383735812017943059782268835280360618754466932406192674904182868594738499500415166599602737300793712012046275485369495600019495004126039595217556097603510836899682827827626851274417838565958464881549888154511565687715162081527027421167926710592169405764372872023265791851279526521097739802047796738013885512616267273220024096214780132567479711643567372517808245262560562426651659391013837988476506124649092538307827326285964637268328029765707984607120961599796336714632362497169952413163370558311283612961033588836334352432860332222878648950508154331165678617373097939647648015552782638392654938551724289386017566932982065441392025369213734676739845068956966278536757235977421127565055467060906533383001625925978595472181091151062798507286798754728450358266089744616465914255799764431508559485853637841082521780322710748029 5460019804609906959990870466177313176084983164281641799671503509393747022018218188953496218589548930610345989543419398509736738709461830797280291056247821618276266613670176736819222576041788101544384620802177944891096783868811538268380758320581911531337040426281564193445169178673697553451356189869176420045215095384362042986181303634013955479331776437601611356383570886490144693580065183004040364311131437779693915842469342458007398091356197445988089776282453099415379284394316086655233088949673106005294984469439336654684063062927629424097860978478752400140363539179281562204466505795140920312543080593149316187266923766409874464592763311969507800636641717511100876446497730582131176406400851005529278784045162794614375038570173989370970426072580596122578783070070020869132109226267607283429012727684089749060079212274462425522613625054717517229065582355337090705481097895199204055216478361641566753047840977824358651656404018971078288591218315211265674466117160770757692570727736979470643298369692 4985238297620234803742588903109002097624069194974216008873335787556184176019479953481549610410690318471391984766225348380613831244057873212285538834884873601821703287701353100465390233569276190098870930279768526550197262821752886655199547952619562650324716407379378738164338836561848863025560089092455251176769098918631685915930643847709745858588982932693819812988495317843741131548671992741215105455172632542174746269812576776198730081274488004812213895374679603848528145208668080980346935047084418437525862081065274599263145907619261379754548677565141069932728908962859358839514253165908393374639966616186359735773529038737616144028073139870303059041095784004759172163511767719049465865825677095260531460468770438883389730044730032249172056972231175687453487114543510159634678745425816587031059271747367091763847515260547444618895808189815039348148497058151990258227187714125159325928248353934579200911789408486043532693868966432238312382363149447035494176703958513348433134246880616790116692805263 8999423311570618981137348891538818027216596300491989181231598151123614651043205656474490923109982595235880446420678700336717534914381729578113169753046083981752465156933790288020841880688083888166659362896648911608716373579944854235997384986302902608821566689026676371268703303207406827737925274781301986480762462594420398637607893961010824979395439225300832931626540179218558345947558472159906873998923767432504278838419479068093778976997276416592421223235719653905071392295735398272851826350645605643470417155719500185143594804374322010189545136205568856276559806316789533450612097900180399440915139647060459321993254566103255011590902408116018722996267956826555434955409390951728022815209412027248353062982911544674007147249326697275010788100666958314965810320432736615962898175585320993128871046552842068867557341007383399180807449030159797672605530835244157256109268527578172314358255179589605335375414082046575557122636364391407861922824529441261003866098066404526541912783214030236752423547997 110159548536582622929575859635210831021463323632502412193578592457118234067116894159316798758933206918936334540039454055299101076302263831614132510576874528929742319396129011617501

यहां तक ​​कि 10,000 वें एक डबल के लिए बहुत बड़ा है, और 20,000 वें 10,000 वें आकार से दोगुना है, इसलिए कल्पना करें कि 4,000,000 वां कितना बड़ा होगा!


शैलीगत मुद्दे:

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

से पढ़ने के लिए बहुत कठिन है

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

हर जगह नंबर दोहराने से बचने के लिए शीर्ष पर निम्नलिखित के साथ:

my $N = 4_000_000;

जवाब के लिए 0 № 2

जैसे कि यह तथ्य कि 4 मिलियन फ़ाइबोनैचि संख्या 10 ^ 835950 isn से अधिक है "एक बड़ी पर्याप्त समस्या नहीं है, यह बहुत अच्छा नहीं है:

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

आप यहां दो बार सूची से क्यों गुजर रहे हैं? दोनों छोरों को एक में मिलाने से बहुत बेहतर होगा। आप विषम शब्दों का योग चाहते हैं, इसलिए विषम शब्दों का योग। डॉन "t delete विषम शब्द (शैलीगत रूप से बहुत खराब) और फिर इस तथ्य पर भरोसा करते हुए कि सूची पर फिर से चलें undef 0 का संख्यात्मक मान है (लेकिन केवल एक चेतावनी के साथ)।

और mn, उस कोड का प्रारूपण बहुत, बहुत हैबदसूरत। आखिरकार आप कोड लिखेंगे जिसे किसी और को पढ़ने या बनाए रखने की आवश्यकता है। मेरा आदर्श वाक्य: कल्पना करें कि जो व्यक्ति आपके कोड को बनाए रखेगा वह एक मनोरोगी है जो जानता है कि आप कहां रहते हैं।


जवाब के लिए 0 № 3

जैसा कि ikegami बताते हैं, आपकी असंगठित समस्या एक सरणी से तत्वों को हटाने को मान रही है, जब वास्तव में यह सिर्फ उन्हें अपराजित करने के लिए सेट करता है (जब तक कि वे सरणी के अंत में नहीं होते)।

बड़े की भंडारण आवश्यकताओं को देखते हुएफाइबोनैचि संख्याएँ, आप उन्हें किसी सरणी में नहीं चाहते हैं; सौभाग्य से, इस समस्या के लिए उन्हें इधर-उधर रखने की कोई आवश्यकता नहीं है। मैं इसे इस तरह से करूंगा (चलाने में कई मिनट लगते हैं):

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