How does a "stack overflow" occur and how do you prevent it?

堆栈溢出是如何发生的,确保它不会发生的最好方法是什么,或者防止它发生的方法是什么,特别是在 Web 服务器上,但是其他的例子也会很有趣?

123541 次浏览

实际代码中很少发生堆栈溢出。大多数情况下,它发生的递归终止已被遗忘。然而,它可能很少出现在高度嵌套的结构中,例如,特别是大型 XML 文档。这里唯一真正的帮助是重构代码,使用显式堆栈对象而不是调用堆栈。

无限递归是获得堆栈溢出错误的常用方法。为了防止-始终确保有一个退出路径 威尔被击中。:-)

Another way to get a stack overflow (in C/C++, at least) is to declare some enormous variable on the stack.

char hugeArray[100000000];

这样就行了。

大多数人会告诉你,在没有退出路径的递归中会发生堆栈溢出——虽然大多数情况下是真的,但是如果你使用的数据结构足够大,即使一个正确的递归退出路径也无济于事。

在这种情况下,有一些选择:

通常,堆栈溢出是无限递归调用的结果(考虑到现在标准计算机通常的内存量)。

当你调用一个方法、函数或过程时,“标准”的方式或者调用方式包括:

  1. 将调用的返回方向推入堆栈(这是调用后的下一句话)
  2. 通常返回值的空间被保留在堆栈中
  3. Pushing each parameter into the stack (the order diverges and depends on each compiler, also some of them are sometimes stored on the CPU registers for performance improvements)
  4. 打真正的电话。

So, usually this takes a few bytes depeding on the number and type of the parameters as well as the machine architecture.

然后您将看到,如果开始进行递归调用,堆栈将开始增长。现在,堆栈通常被保留在内存中,这样它就会朝着与堆相反的方向增长,因此,如果有大量的调用而没有“返回”,堆栈就会开始变满。

现在,在以前,堆栈溢出可能仅仅因为您耗尽了所有可用内存而发生,就像这样。对于超出范围的虚拟内存模型(在 X86系统上最多可达4GB) ,所以通常情况下,如果出现堆栈溢出错误,请寻找无限递归调用。

当 Jeff 和 Joel 希望为世界提供一个更好的地方来获得技术问题的答案时,就会发生堆栈溢出。现在阻止堆栈溢出已经太晚了。那个“其他网站”本可以通过不弄脏它来阻止它。;)

Considering this was tagged with "hacking", I suspect the "stack overflow" he's referring to is a call stack overflow, rather than a higher level stack overflow such as those referenced in most other answers here. It doesn't really apply to any managed or interpreted environments such as .NET, Java, Python, Perl, PHP, etc, which web apps are typically written in, so your only risk is the web server itself, which is probably written in C or C++.

看看这个帖子:

Https://stackoverflow.com/questions/7308/what-is-a-good-starting-point-for-learning-buffer-overflow

Stack

在此上下文中,堆栈是在程序运行时放置数据的最后进出缓冲区。后进先出(LIFO)意味着你最后输入的东西总是你第一个返回的东西——如果你在堆栈上推2个项目,‘ A’然后‘ B’,那么你第一个从堆栈上弹出的东西将是‘ B’,接下来是‘ A’。

在代码中调用函数时,函数调用后的下一条指令存储在堆栈中,以及可能被函数调用覆盖的任何存储空间。您调用的函数可能会为自己的本地变量使用更多的堆栈。完成后,它将释放它使用的本地变量堆栈空间,然后返回到前一个函数。

堆栈溢出

堆栈溢出是指堆栈使用的内存超过了程序应该使用的内存。在嵌入式系统中,堆栈可能只有256个字节,如果每个函数占用32个字节,那么你只能让函数调用8 deep-function 1调用 function 2谁调用 function 3谁调用 function 4..。调用函数8调用函数9但是函数9覆盖堆栈外的内存。这可能会覆盖内存、代码等。

Many programmers make this mistake by calling function A that then calls function B, that then calls function C, that then calls function A. It might work most of the time, but just once the wrong input will cause it to go in that circle forever until the computer recognizes that the stack is overblown.

递归函数也是导致这种情况的原因之一,但是如果您正在递归地编写(即,您的函数调用自身) ,那么您需要注意这一点,并使用静态/全局变量来防止无限递归。

一般来说,操作系统和您正在使用的编程语言管理堆栈,这不在您的掌控之中。您应该查看您的调用图(一个树结构,它从您的 main 中显示了每个函数调用的内容) ,以查看函数调用的深度,并检测不需要的循环和递归。有意识的循环和递归需要人工检查,以便在它们相互调用太多次时出错。

除了良好的编程实践、静态和动态测试之外,您在这些高级系统上能做的事情不多。

嵌入式系统

在嵌入式世界中,特别是在高可靠性代码(汽车、飞机、太空)中,您需要进行大量的代码检查和检查,但是您还需要执行以下操作:

  • Disallow recursion and cycles - enforced by policy and testing
  • Keep code and stack far apart (code in flash, stack in RAM, and never the twain shall meet)
  • 在堆栈周围放置防护带——用一个神奇的数字填充空白的内存区域(通常是软件中断指令,但这里有很多选项) ,每秒数百次或数千次查看防护带,以确保它们没有被覆盖。
  • 使用内存保护(即,不在堆栈上执行,不在堆栈外读写)
  • Interrupts don't call secondary functions - they set flags, copy data, and let the application take care of processing it (otherwise you might get 8 deep in your function call tree, have an interrupt, and then go out another few functions inside the interrupt, causing the blowout). You have several call trees - one for the main processes, and one for each interrupt. If your interrupts can interrupt each other... well, there be dragons...

高级语言和系统

但在操作系统上运行的高级语言:

  • 减少您的本地变量存储(本地变量存储在堆栈上——尽管编译器在这方面非常聪明,如果您的调用树很浅,有时会在堆上放置大的本地变量)
  • 避免或严格限制递归
  • 不要把你的程序分解成越来越小的函数——即使不计算本地变量,每个函数调用在堆栈上也要消耗64个字节(32位处理器,节省了一半的 CPU 寄存器、标志等)
  • 保持调用树浅(类似于上面的语句)

网络服务器

It depends on the 'sandbox' you have whether you can control or even see the stack. Chances are good you can treat web servers as you would any other high level language and operating system - it's largely out of your hands, but check the language and server stack you're using. It possible to blow the stack on your SQL server, for instance.

亚当

除了你从直接递归(例如 Fibonacci(1000000))中得到的堆栈溢出形式之外,我经历过很多次的一种更微妙的形式是间接递归,其中一个函数调用另一个函数,这个函数调用另一个函数,然后其中一个函数再次调用第一个函数。

这通常发生在响应事件而调用的函数中,但这些函数本身可能会生成新事件,例如:

void WindowSizeChanged(Size& newsize) {
// override window size to constrain width
newSize.width=200;
ResizeWindow(newSize);
}

在这种情况下,对 ResizeWindow的调用可能导致再次触发 WindowSizeChanged()回调,这将再次调用 ResizeWindow,直到堆栈用完。在这种情况下,您通常需要推迟对事件的响应,直到堆栈帧返回,例如通过发布消息。

我重新创建了堆栈溢出问题,同时得到了一个最常见的斐波那契数列,即1,1,2,3,5... ..。因此计算 fib (1) = 1或 fib (3) = 2。.Fib (n) = ? ?.

对于 n,假设我们感兴趣的是-,如果 n = 100,000,那么相应的斐波那契数列是什么?

单循环方法如下-

package com.company.dynamicProgramming;


import java.math.BigInteger;


public class FibonacciByBigDecimal {


public static void main(String ...args) {


int n = 100000;
BigInteger[] fibOfnS = new BigInteger[n + 1];


System.out.println("fibonacci of "+ n + " is : " + fibByLoop(n));
}




static BigInteger fibByLoop(int n){


if(n==1 || n==2 ){
return BigInteger.ONE;
}


BigInteger fib = BigInteger.ONE;
BigInteger fip = BigInteger.ONE;




for (int i = 3; i <= n; i++){


BigInteger p = fib;
fib = fib.add(fip);
fip = p;
}


return fib;
}


}

这很直接,结果是-

fibonacci of 100000 is : 259740693472217241661550340212759154148804853865176965847247707039525345435112736862655567728367167447546375872230744321116383994738750910309656973821883044930522876385313349213530267927895670105127657827163560807305053220024323311438398651613782723812477745377833729991621463405005466986039086275099663936640921189012527196017210506030035058689402855810367511765825136837743868493641345733883436515877542537191241050033219599133006220436303521375652542182399869084855637408017925176162939175496345855861630076281991608110983652635299544069428420657104604490380564713634603300052085227770755444679472370903097901901486043284681985796101595100185060826491923458731339915013391993236310230186417253647713626647508013398243123170343145296418179005118795731676683497990168201184990775668645684506628739248560391404760519955006628882634587718941068037009187936500173301171002831047394745625609144493282137485557386408057981302826664027035429441210491999580313187680589918651342517595991152056315533770399694103551827527491995980225750790203779810308992298499630449625581404551700025029976432219346216536621084187674542829826139823447836658158804081900330738293950008213200937471548513102722081730543226486694963098791471436292555425262404399961532697987680751064681906879211829916796440917827186856170291810221267926740136265049978496884368097525470013100457418640644829948587255174474669565187912691699324456481767332225714931496776334584662383033382023970243685947828764187578857291071013370030009422933359729277919140921280490154597626279105705524815888405177941819290521676957660874881556786012881835435429230739781015478570132843861272862017665395344499300198006295389369855007232866513171811358866135374726845854325489811371766051946169379168844253425947812631038895204795659438071530191125396484711263890071336285691015514534233294412843572209962867461194209516610023097407099655319005081586699114454426478828726428450172533204864831945789203998489382363674561822037509734856684743388724904933703163382657176072977889179891366732519062324711803728017392157239082276922807729245666275053833750069260772105936194212689203025674435653780083183063759333450235025697290651528532719436775601566603991640488256396769307929050295148869341379912517485666707471751493897903865333813953468483780861267375543838211084489765383684831825883633991731045585090566384620250146313118310874290772926221594302042915947403061018398168550669502619737615085717611994758757221298720531206079186498036159609233959410411863516885488391191851790615115627529361584900087215019222651178531508925102752804515123860379218469212153382928713692432152733271415747882959026015719548531644479454675028584023600023834479052034510803328201380388070898073483262012279526336067736698757833262548594490602191736886778624112056210983698501972901771578011204045864915393511578349954610063663574544850824188827906753135995051920622297601537652979730858816487311730823705982848940448740393205359293597645416556079547247786202996923295613897198946794221872736051233655952113310877875822887959758032045960847902450638519417431261637751045992110248687949634170686209290889306852523480569259983337751039010131661781230511457193270662916712544651215174680254819035835168897170757067786561880082203468363210181302623299602759940357999777404624495211453158837035790448329315000724617341735580556783215345434117002025856080916629419863740151456957227283692196322951118776253075340259478144820465746028848550006280693481139827601685558407954216205754355729151064153759293902288435612079264370556006236798654438246437394697247194599655579550583803482559783968277608473153025178895171863072276110363050936007426226171736305861329154402469543290461625869177463057850767493748799232918175016348406881346553437099758935360740517290941269765759329515681862474712763646883655175701835341727466260730651045119576286634992284867878059108511898565355543495876166401644758802863362970404628909706773625658430023531474946123391206863214663708784469921042754156941091224656857120471724113337848981676409692498163342117685715
031167104006817530319211541561195804257065869312727621371069747222602965552461105371555453249975084327520019921430191050536299600704296329780510306665063878626815765877268374512897685079636637105938091122542883583919412115477375998130192165095214013330607098731373292651816922684506344395405672981203154639232498179378046910379342216949522910079302994923750729932506305094281390279308413447306141164335561476409310442591848136393054236937897652052645634764831827263337151211203062923388928648794920973784786188486826080464731953920084039830800880386904955741975621929392211082576639768136104449002472094834032679676883762139674407571388729286307982184931434387977808873795889684094614341592713175783651145782893558185990292353438888884658745213083813777944363611976283903689459576012031650227985790154534474735270697285145459986142290273729113146378204551622544753535677362279364854503571020864454120898423503890877022303984938021473480968743333622544915011741175157070456105089527400020638049796796040261781866448124854726963082347337724554339051984130876978127656591676422902294818176307571025579336500815228638363449313808997178508707086363220586901893837776606300606675773242727292924742129526500070664672273000995612419140913898467522495579072939849560875045669421777155110734663045660394413623588844367621527392859707228793735596672392461382746870321785845994825751474540643646099705931612059684156047323439665245723165031779283386059038836041769142873273570398680334260467007171736357309112298130690328613712259793709660577517296452826375743407579228218074435290866960685402171859789116633386385858973620911424843217864503947919542420819162608857106911043399480147301310086984886643072121676247311961819073782076658296828079607948225954903632826657800699485682530053643667482253460370513450360315215429694399186623685763806235120988444874113860017117364763212602996140856192559970756682786677873237741944446227539990929104469771647615111867232723867920813336730618194484939660712334527185652025364362196419878275297881306008031314181706931446822118927578497828109436775154071010635055379800384221904550848223938699329692665922111274269813306230007346562849809363669304944680162855371263341262037849191949860009720083672787665078688630693341899522576831439083248488634031894019416103697984383334660867670943164365353843091215781554351285207772085809890209958644960247949197068723076568710923438071950982481447315781378008063935841875665509850132188285284018498140769073850736953537771188038852893534760093033859869160828933542114772293656190727626460372602723932099118782040706741227225812076672904007192423793033097213236418409395610299597129179982829000953914738243780277905111203095458253288872114617013344038593965404780619933322454731780340734090251213021727959575386315814881039295247541094388055509838262763312760671812617102201135618180077540022751673414416921642497317562136312858828197800578883245453458152243493726813343399771051253208147834506713983503833290131394598648182027232204334193092901190783289656922287833749735430156172282911562732946881485328192210075237362682764315268573549322302801810144964900901552924863833888566489300225097434360120081436515362536919944670971112695196672578006189121544022248756460155463281209194582465355743204764421265079065520820833797607146512750832048716527157747232588727576112835759213255393444628943325810502863358366929182856689473622350825029496406579863080961434169683046759517435531322436266420719760845902426301747339222529124836631642800655287097505199750491300985946807101360233644016440017918861085323076499171437205446782359721176046515320016308533631935158964589068172237281231032027189791795127279965605369403211124284659099455638021546131610626752163380566439431888126819949400553706869762185523185892110096344101293353573391845966819753983428469682288946007635203168892200202193131836975755696206111577430582630553586201563789124603122067293399261737837962515099993540364873142320887397796890890836999629299539197721779653342124929197838375146006205496734166283348734101109777053589806649813601139557158432830871394058253
527405608101150390794168807919721293314830307263867863141103844312821599493682434299818871976863760449634259752425688618868897898088831586507626260485646500432289685614925506396881140440042950389424587238223354310107869151732833360477926272776568607617770561687405025774374998377583014385613542727383858977413352694916548392972151955479357892386676250274537010466090938244962662693532130374453889247921616118888970207791044856319951482663080287954954645358386630734442375331971227915886170728965209014984830543598320077132665340729066201677570640969018377120130682324533347796666052532549087360196148037824156607127165038358225728921570820936951099589013285949072430618332575520120809000717502202294974280182344541371191629844991472225419659468222146826064496183925424967090310400758148885797167224632288701643840390846385673116430816953732679030311458368057502111963990561516915470851045970054209857179731801556474140617233414584711126854792989244300139146828910367917921697861658248900732203359137670652767652130714398530276098847805621699465965546137917498565973922737941672649537780199209835542786617912312669937473077773056932443016683933301155451554265686493749212868704912175424596783113296924849246674426199903397282567487346020115044222878046612432018301610823218390865477104239822853131655968568800522657147442882331753945654388192862443266250334538819959008510521138312449186180262443219554043398572284134125440941177172215686708629174212405311062052284298619927362940620883475485364512812327960909721395377536002307676569420821994303464878334854449271353945022459133437466493770165560576338469706291872574542650587941463017663976045747431108155674709165270874812526715991379324052730461369396116989258980831190632251077792856207199945948770061180100229613230458829455844095249661115834280490864386088079644055776369185774375402589685592725251456340438521782589059955395462745138545445291676104296926797089358005623450191857148903041849576740081935997321871195749635709596782517109626475206889080640765144589313287076745416960710793169270428516809341331104635350624220981036321677191042078616218421376393819462569728678141363638962012397691046541895680619732314841422455007161721585132130203068417608721589270209887910893808104590339727654732641691684544562760075956136710358457564909443069245253208500309106878315756151984756756919128478465469255866511155791346127242533608363513134218390517715451122846445513601601351322894854327150476083930755610090878609666387061227869027483181933160670148495716300470526222823840626681844878837454813199438038761383012885988526420199228618820849958864088852135250145761539648264745102590253074317295689963649961570755185583716593536712544851508936290456773663003556245737477910098799249914696722404148160128953094401548894261378314008780431143174185807182618514905113874483135843906722894940825828602165028892722838742643278616869038196053015589445945180873519724600822152934398082825412612825715720935098538280073856047291094118400608448523537783350330686197772450188636407034497336647310060201812879288699186182441845396899477725948216913713364747045317297980924584436112961899759569624097184556402051143258959184472492094293030165148871307980210237906553652515478029805940752944051314580755153779486163587990115819201980887969496718744822415683646353432616024263293476163445816389016380512389418452397342184149688926239848964864209340981668149477115517700956266902985010151353759980127250124197111987152659374748477893548877781519293117143116744477388294106461502875132770947450476392287489066298984154025935083403514203513616881924823899802770666691634213342431205450735938861668769118818577611813577133248396520988208598239129860638682280475436240895652292141085985203733054462595326134023486468927506052689375514840329854208699122105259700562857670770256769530097897004640892000985210698029541969980213805329579815947828993444324549156532784522384055124044520822643542065631331070294072237155277050426348207398445488958924886139765707914541442765358457295132971909194769441191096679747426267559095383203916967349426136003226307742868410504
006135105219441377815809500571452684600981035210924904002795805073643696102124113773971716486952549311480504012656835126882959841398322267637780450062650724173175739521979689075482519932925964980162706866565803017887740561516715973192732047937624737550585505283966029456699252217360087408121201420907104193759857172143133801742514158249182471090508471597724941704932025416523932323325885158889333709713631089257153141776197832603375010902628406641580137135935652927808845630595177008144399411467429185036074885236665474486992808323051681571160291183637414795849210086052898146954775081233889694315286102120273674704990393041703517134212692348670056662750622905863691188222890317051030540688209697087554532936943406398129769647803182545164217834734771647105842323859458018305275621391018699760430584406866571234686967945604415574210003917975834897993588275188152467593087892815924349219754538766830568466842077540982178124705335452319479739895332017598864028105882555769800439712053831245942895737769600185749733524996501350936892595802186381172590650643688212715681575102171290076599275037022828396396291597325117341858672102349731776596945428362551937155600914368032931196284254662840314244437064843239037490641081130079284895576724348120009030988845727090775087363887329964255505047381252897596293482287891761992072513830938828829251041683762275820408191893360365387528411678570372098971883298692192781662967584458017491180911966304818743415506779086394883148924150430047670452797128348221152220283706285731424410782379251364508667756662280497721139714062166411632475678421661296147710901882609467737768640617672148429389497667138012278894130902655351109611834701256519754080709538406091686393690667378662720942943426426040290215831734500372746258899262204987712117840556334849249032600350856909938239277729749841356561483078826236332236838070982234601227424137903647345173592521575475716093427093519290172395492142649069111527152333810912404281210289373848816735895393450893069771552298919969890388588327540904430032198683400347027122002015969937169065033054757709539874858067002449104550489006172718916803139452803616563394157133463722255047754746075605502410876438212168884891694037125890194849068537972224456200948381949153272450227621858916950740579498375982100660448199651936011026157694717620257170204868491461689406840414083358756211831921083800563214456201894150594578002531874747191160484067799776541483062217906933085387512929898300958027755414543505876898494417913653589162009872522204905518355460370653318317671611073800978662524748869147607766447014719307447630241166033567176556487444057799053199627163297200910944924921645603061882777294775076477744645258632891915910744425232008291820951802108370035388133098321589460868012795422475207192413464833496391509481309754143324420929993075148107791900234612812233016179942993061880053341455063393213933964686161641695522021644799541724317116574447136419773320489936507476784414992954807302585644294238178764150649287836176797867715851078423570264021338801887560198923405686842321558562850864552525837701062053222424498799062526348401077432248817255860223330207639993385415201534384772544291789513063705032044491779775237087195827797679968611362653229111862963116468515993466069346055754595606315583003369763400027668515129384363888609082837614115773200352756515874590656702543943793110483857131329449060492658236310894953509008267315449722639664808861804157397788847289217461897418972170077000986244965375901272701522763451087490694801221068495206300251901165596358055242918020558690425968526104741283451846673693858002770025296535636672161988367242822693395032593039099458316866554223465485702087550461752052185372156728267990341813552060299989536647010655790053212954133692447249221243632452304289518846177912233806967423398069488727058750338922839509513520912310925815900696039515636773606710905056629960357187642324792075283616080559769777875647676721052122232718482148444663126148758422609260887576433173102326376886482259469121103236773755812213347055680595800831012748167396201958359802396741448986727684586981937678375716793
672321308158619104599505897099106468691946344803857414382962954713137217366983618455814450574867612432245151994336218291619146802609112179300186478805006135160314435007618921344160248809174105123229035717920549792797092450247994084269615881844261616378004475947821224087320412442116919980557264911824366192183571476289142580577187174368800032411300870481937396229501714309009847692723749887593863994253059533160789161881086350598244457894279934651491595288486975748802582335357167786482682805114088542973278819776573696600572770016259240430168865994686298371727059580980873090182012093100343005879655269478804980920548430546761103465474806729067439976361259243463771999584386281239198547020241488007688081884808789239159136946329311327684932977720164664172758725912235478448081343332805008775885526468611957696217223930869379575716582185241620434197238398993273480342926234072233815510220910126294924974242327169884202329730326016179057567311123546589029829831311512360760677396899815381228699964201460985257979369124601634608876232128620563421590147918863219465963748348256429161627853294823931322944023104327728876813955021334826638868745325928158785450389099156194963247885503509028939097371898800399902613201587267863787309567810962531100805448941885798356590206368069964316503391202994432772677086930524071841659207009613928640196672575008701221814973313369580960036975176495135004028592624920339811101495322753362184450074433156243453248421798610834626134589759123483997075185422328167718721595682724324591082901988639036978454262256691254274705609756798485713662367902387847816120147798293908051315025817452377352951016529693456278612224115078358775537334837276443983808200066721474003446632277691893696761287898348894209468810230842703645285450496675969731883604449670285319063739691635798092886571993539772349548678718041640141528148944378503629107151780528585758398771114547424015641647719411639135493546675559359260884920054638468540302808093641725058365336809340722531082084472357022680982695142616245120404071150144874785619992281466456589393848802864382231384985232845236066704580511367966375103924816333617327454727577563681097734453927582756059742516070546868965779453052160231593986578097480151541498709777807870535705800847237689242218975031275852714017311762127989874495840619984391336568029772120875193498850449971391428515803232482302134063031258607262454163776523450552205108631828535965852070817339270956644501140405510657905503741778039335165836090454304772142228181683253961363498252521523225769092025421640965745261806605177790159290288424059999888275369195754011695469615227040128085757976615472219292565596399182094889464265751228876633030213374636744921744935163710472573298083281272646818775935658421838359470279201366390768974173896225257578266399080979264701140758036785059938188718456009469583327077512618128201539104177395091824413756199993781924036246955823592417147870277944844310875190180741411029037070605208516297579836175425104164224486757735075633801889537926318338985595595652785722792615552449473936366553390452865621546428834316228292112329045184221253288810141588406161993919504223005989834996656946358018681671707481882321584864773438678091156466075517538555222442852404946803369229998930078390002069012151774069642857393019691050098827852305379763794025796895329511243616677891058555721338178908994545394791592737495860026823784448687203724348883461685629009785053249703693336194243980288236432355380820800387574171096928972549987856625304886703309515051845212694498925159639207942145260650851605232561486193828248983800081508535156464276170083209648311794440197178014921334533590333667237671922972206997076605548245224741692777463752213520171623172213763244569915402239549415822741893058991174693177377651873585003231801443288391637424379585469569122177409894861151556404660956509453811552092186371151868456254327504787053000699842314018016942110910592549359611671945763096232883127126832850176032177168040024965767418692711321557327004993570994232441638708924242758440765121557267603792476534180898431267694111031316595142947937767069888124964342
1933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875


现在,我已经应用的另一种方法是通过递归进行分割和协商

即 Fib (n) = Fib (n-1) + Fib (n-2) ,然后再递归到 n-1 & n-2... ... 直到2 & 1。它被编程为

package com.company.dynamicProgramming;


import java.math.BigInteger;


public class FibonacciByBigDecimal {


public static void main(String ...args) {


int n = 100000;
BigInteger[] fibOfnS = new BigInteger[n + 1];


System.out.println("fibonacci of "+ n + " is : " + fibByDivCon(n, fibOfnS));


}




static BigInteger fibByDivCon(int n, BigInteger[] fibOfnS){


if(fibOfnS[n]!=null){
return fibOfnS[n];
}


if (n == 1 || n== 2){
fibOfnS[n] = BigInteger.ONE;
return BigInteger.ONE;
}


// creates 2 further entries in stack
BigInteger fibOfn = fibByDivCon(n-1, fibOfnS).add( fibByDivCon(n-2, fibOfnS)) ;


fibOfnS[n] = fibOfn;


return fibOfn;


}


}

当我运行 n = 100,000的代码时,结果如下-

Exception in thread "main" java.lang.StackOverflowError
at com.company.dynamicProgramming.FibonacciByBigDecimal.fibByDivCon(FibonacciByBigDecimal.java:29)
at com.company.dynamicProgramming.FibonacciByBigDecimal.fibByDivCon(FibonacciByBigDecimal.java:29)
at com.company.dynamicProgramming.FibonacciByBigDecimal.fibByDivCon(FibonacciByBigDecimal.java:29)


上面你可以看到创建了 StackOverflow 错误。现在的原因是太多的递归作为-

        // creates 2 further entries in stack
BigInteger fibOfn = fibByDivCon(n-1, fibOfnS).add( fibByDivCon(n-2, fibOfnS)) ;

因此,堆栈中的每个条目又创建了2个条目,以此类推... ... 它被表示为-

enter image description here

最终会创建如此多的条目,以至于系统无法在堆栈中处理并抛出 StackOverlowError。

预防: 对于上面的例子透视图- 1.避免使用递归方法或再次减少/限制递归一级除法,比如如果 n 太大,那么将 n 分割,以便系统能够处理其极限。 2. Use other approach, like the loop approach I have used in 1st code sample. (I am not at all intended to degrade Divide & Concur or Recursion as they are legendary approaches in many most famous algorithms.. my intention is to limit or stay away from recursion if I suspect stack overflow issues)