답변:
이 컨텍스트에서 스택은 프로그램이 실행되는 동안 데이터를 배치하는 마지막 인선 출 버퍼입니다. LIFO (Last in, First Out)는 마지막으로 넣은 것이 항상 처음으로 다시 나오는 것임을 의미합니다. 스택에 'A'와 'B'를 차례로 밀어 넣으면 가장 먼저 튀어 나온 것입니다. 스택에서 'B'가되고 다음은 'A'입니다.
코드에서 함수를 호출하면 함수 호출 후 다음 명령어가 스택에 저장되고 함수 호출로 덮어 쓸 수있는 저장 공간이 저장됩니다. 호출하는 함수는 자체 지역 변수에 대해 더 많은 스택을 사용할 수 있습니다. 완료되면 사용한 로컬 변수 스택 공간을 비운 다음 이전 함수로 돌아갑니다.
스택 오버플로는 프로그램에서 사용하는 것보다 더 많은 메모리를 스택에 사용했을 때 발생합니다. 임베디드 시스템에서는 스택에 256 바이트 만있을 수 있으며 각 함수가 32 바이트를 차지하면 함수 호출 8 개만 가질 수 있습니다. 함수 1은 함수 4를 호출하는 함수 3을 호출하는 함수 2를 호출합니다. 함수 9를 호출하는 함수 8이지만 함수 9는 스택 외부의 메모리를 덮어 씁니다. 메모리, 코드 등을 덮어 쓸 수 있습니다.
많은 프로그래머가 함수 A를 호출 한 다음 함수 B를 호출 한 다음 함수 C를 호출 한 다음 함수 A를 호출함으로써 이러한 실수를 저지 릅니다. 대부분의 경우 작동 할 수 있지만 잘못된 입력이 한 번만 입력하면 해당 서클에 영원히 남게됩니다. 컴퓨터가 스택이 과도하다는 것을 인식 할 때까지.
재귀 함수도 이에 대한 원인이지만, 재귀 적으로 작성하는 경우 (즉, 함수 자체 호출)이를 인식하고 정적 / 전역 변수를 사용하여 무한 재귀를 방지해야합니다.
일반적으로 사용중인 OS와 프로그래밍 언어가 스택을 관리하며 손이 닿지 않습니다. 함수 호출의 깊이를 확인하고 의도하지 않은 순환과 재귀를 감지하려면 호출 그래프 (각 함수가 호출하는 내용을 메인에서 보여주는 트리 구조)를 확인해야합니다. 의도적 인 순환과 재귀는 서로를 너무 많이 호출하면 오류가 발생하도록 인위적으로 검사해야합니다.
좋은 프로그래밍 관행, 정적 및 동적 테스트 외에 이러한 높은 수준의 시스템에서 할 수있는 일은 많지 않습니다.
임베디드 세계, 특히 고 신뢰성 코드 (자동차, 항공기, 우주)에서 광범위한 코드 검토 및 검사를 수행하지만 다음 작업도 수행합니다.
그러나 고급 언어에서는 운영 체제에서 실행됩니다.
스택을 제어하거나 볼 수 있는지 여부는 보유한 '샌드 박스'에 따라 다릅니다. 웹 서버를 다른 높은 수준의 언어 및 운영 체제처럼 취급 할 수있는 가능성이 높습니다. 대부분 손에 닿지 않지만 사용중인 언어 및 서버 스택을 확인하십시오. 이다 예를 들어, SQL 서버의 스택을 날려 버릴 수있다.
-아담
무한 재귀는 스택 오버플로 오류를 얻는 일반적인 방법입니다. 방지하기 위해 - 항상 확인하는 것은 반드시 출구 경로있을 것입니다 타격을받을. :-)
스택 오버플로를 얻는 또 다른 방법 (적어도 C / C ++에서는)은 스택에 엄청난 변수를 선언하는 것입니다.
char hugeArray[100000000];
그렇게하겠습니다.
일반적으로 스택 오버플로는 무한 재귀 호출의 결과입니다 (요즘 표준 컴퓨터의 일반적인 메모리 양을 고려할 때).
메서드, 함수 또는 프로 시저를 호출 할 때 "표준"방식 또는 호출은 다음과 같이 구성됩니다.
따라서 일반적으로 이것은 매개 변수의 수와 유형 및 기계 아키텍처에 따라 몇 바이트가 걸립니다.
그러면 재귀 호출을 시작하면 스택이 커지기 시작한다는 것을 알 수 있습니다. 이제 스택은 일반적으로 힙과 반대 방향으로 증가하는 방식으로 메모리에 예약되어 있으므로 "돌아 오지 않는"많은 호출이 주어지면 스택이 가득 차기 시작합니다.
이제 예전에는 사용 가능한 모든 메모리를 소진했기 때문에 스택 오버플로가 발생할 수 있습니다. 범위를 벗어난 가상 메모리 모델 (X86 시스템에서 최대 4GB)의 경우 일반적으로 스택 오버플로 오류가 발생하면 무한 재귀 호출을 찾습니다.
뭐? 무한 루프에 걸린 사람들을 사랑하는 사람이 없습니까?
do
{
JeffAtwood.WritesCode();
} while(StackOverflow.MakingMadBank.Equals(false));
직접 재귀 (예 :)에서 얻은 스택 오버플로의 형태를 제외하고 Fibonacci(1000000)
, 제가 여러 번 경험 한보다 미묘한 형태는 간접 재귀입니다. 여기서 함수는 다른 함수를 호출하고 다른 함수를 호출 한 다음 이러한 함수는 첫 번째 함수를 다시 호출합니다.
일반적으로 이벤트에 대한 응답으로 호출되지만 자체적으로 새 이벤트를 생성 할 수있는 함수에서 발생할 수 있습니다. 예를 들면 다음과 같습니다.
void WindowSizeChanged(Size& newsize) {
// override window size to constrain width
newSize.width=200;
ResizeWindow(newSize);
}
이 경우에 대한 호출로 ResizeWindow
인해 스택이 부족해질 때까지 WindowSizeChanged()
콜백이 다시 트리거 ResizeWindow
될 수 있습니다. 이와 같은 상황에서는 스택 프레임이 반환 될 때까지 (예 : 메시지 게시) 이벤트에 대한 응답을 연기해야하는 경우가 많습니다.
이것이 "해킹"태그가 붙은 것을 고려할 때, 그가 언급 한 "스택 오버플로"는 여기 대부분의 다른 답변에서 참조 된 것과 같은 상위 수준 스택 오버플로가 아니라 호출 스택 오버플로라고 생각합니다. 웹 앱이 일반적으로 작성되는 .NET, Java, Python, Perl, PHP 등과 같은 관리 또는 해석 환경에는 실제로 적용되지 않으므로 유일한 위험은 웹 서버 자체입니다. C 또는 C ++.
이 스레드를 확인하십시오.
/programming/7308/what-is-a-good-starting-point-for-learning-buffer-overflow
가장 일반적인 피보나치 수 즉 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 : 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875
이제 내가 적용한 또 다른 접근 방식은 재귀를 통한 Divide 및 Concur입니다.
ie 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)
위에서 StackOverflowError가 생성 된 것을 볼 수 있습니다. 이제 그 이유는 너무 많은 재귀입니다.
// creates 2 further entries in stack
BigInteger fibOfn = fibByDivCon(n-1, fibOfnS).add( fibByDivCon(n-2, fibOfnS)) ;
따라서 스택의 각 항목은 2 개의 항목을 더 생성합니다.
결국 너무 많은 항목이 생성되어 시스템이 스택에서 처리 할 수없고 StackOverflowError가 발생합니다.
예방을 위해 : 위의 예제 관점에서-1. 재귀 접근법을 사용하지 않거나 n이 너무 크면 시스템이 한계 내에서 처리 할 수 있도록 n을 분할하는 것과 같이 다시 한 단계 분할로 재귀를 줄이거 나 제한합니다. 2. 첫 번째 코드 샘플에서 사용한 루프 접근법과 같은 다른 접근법을 사용하십시오. (나는 가장 유명한 알고리즘에서 전설적인 접근 방식이기 때문에 Divide & Concur 또는 Recursion을 저하시키려는 의도가 전혀 없습니다. 스택 오버플로 문제가 의심되는 경우 재귀를 제한하거나 멀리하는 것이 제 의도입니다)