"스택 오버플로"는 어떻게 발생하며 어떻게 방지합니까?


97

스택 오버플로는 어떻게 발생하고 발생하지 않도록하는 가장 좋은 방법은 무엇이며 특히 웹 서버에서이를 방지하는 방법은 무엇입니까?하지만 다른 예제도 흥미로울까요?

답변:


126

스택

이 컨텍스트에서 스택은 프로그램이 실행되는 동안 데이터를 배치하는 마지막 인선 출 버퍼입니다. LIFO (Last in, First Out)는 마지막으로 넣은 것이 항상 처음으로 다시 나오는 것임을 의미합니다. 스택에 'A'와 'B'를 차례로 밀어 넣으면 가장 먼저 튀어 나온 것입니다. 스택에서 'B'가되고 다음은 'A'입니다.

코드에서 함수를 호출하면 함수 호출 후 다음 명령어가 스택에 저장되고 함수 호출로 덮어 쓸 수있는 저장 공간이 저장됩니다. 호출하는 함수는 자체 지역 변수에 대해 더 많은 스택을 사용할 수 있습니다. 완료되면 사용한 로컬 변수 스택 공간을 비운 다음 이전 함수로 돌아갑니다.

스택 오버플로

스택 오버플로는 프로그램에서 사용하는 것보다 더 많은 메모리를 스택에 사용했을 때 발생합니다. 임베디드 시스템에서는 스택에 256 바이트 만있을 수 있으며 각 함수가 32 바이트를 차지하면 함수 호출 8 개만 가질 수 있습니다. 함수 1은 함수 4를 호출하는 함수 3을 호출하는 함수 2를 호출합니다. 함수 9를 호출하는 함수 8이지만 함수 9는 스택 외부의 메모리를 덮어 씁니다. 메모리, 코드 등을 덮어 쓸 수 있습니다.

많은 프로그래머가 함수 A를 호출 한 다음 함수 B를 호출 한 다음 함수 C를 호출 한 다음 함수 A를 호출함으로써 이러한 실수를 저지 릅니다. 대부분의 경우 작동 할 수 있지만 잘못된 입력이 한 번만 입력하면 해당 서클에 영원히 남게됩니다. 컴퓨터가 스택이 과도하다는 것을 인식 할 때까지.

재귀 함수도 이에 대한 원인이지만, 재귀 적으로 작성하는 경우 (즉, 함수 자체 호출)이를 인식하고 정적 / 전역 변수를 사용하여 무한 재귀를 방지해야합니다.

일반적으로 사용중인 OS와 프로그래밍 언어가 스택을 관리하며 손이 닿지 않습니다. 함수 호출의 깊이를 확인하고 의도하지 않은 순환과 재귀를 감지하려면 호출 그래프 (각 함수가 호출하는 내용을 메인에서 보여주는 트리 구조)를 확인해야합니다. 의도적 인 순환과 재귀는 서로를 너무 많이 호출하면 오류가 발생하도록 인위적으로 검사해야합니다.

좋은 프로그래밍 관행, 정적 및 동적 테스트 외에 이러한 높은 수준의 시스템에서 할 수있는 일은 많지 않습니다.

임베디드 시스템

임베디드 세계, 특히 고 신뢰성 코드 (자동차, 항공기, 우주)에서 광범위한 코드 검토 및 검사를 수행하지만 다음 작업도 수행합니다.

  • 재귀 및주기 금지-정책 및 테스트에 의해 시행
  • 코드와 스택을 멀리 떨어져 유지하십시오 (플래시 코드, RAM 스택, 두 사람이 만나지 않음).
  • 스택 주위에 가드 밴드를 배치합니다. 매직 넘버 (일반적으로 소프트웨어 인터럽트 명령이지만 여기에는 많은 옵션이 있음)로 채우는 빈 메모리 영역이 있으며, 1 초에 수백 또는 수천 번 가드 밴드를 확인하여 확인합니다. 덮어 쓰지 않았습니다.
  • 메모리 보호 사용 (즉, 스택에서 실행 안 함, 스택 외부에서 읽기 또는 쓰기 안 함)
  • 인터럽트는 2 차 함수를 호출하지 않습니다. 플래그를 설정하고, 데이터를 복사하고, 애플리케이션이 처리하도록합니다 (그렇지 않으면 함수 호출 트리에서 8 개 깊이를 얻고 인터럽트가 발생한 다음 내부의 다른 몇 가지 함수로 이동할 수 있습니다. 중단, 폭발 유발). 여러 호출 트리가 있습니다. 하나는 주 프로세스 용이고 하나는 각 인터럽트 용입니다. 당신의 인터럽트가 서로를 방해 할 수 있다면 ... 글쎄, 드래곤이 있습니다 ...

고급 언어 및 시스템

그러나 고급 언어에서는 운영 체제에서 실행됩니다.

  • 로컬 변수 저장소를 줄입니다 (로컬 변수는 스택에 저장됩니다-컴파일러는 이에 대해 꽤 똑똑하고 호출 트리가 얕은 경우 힙에 큰 로컬을 배치 할 수도 있음).
  • 재귀를 피하거나 엄격하게 제한
  • 프로그램을 더 작고 작은 함수로 너무 많이 나누지 마십시오. 지역 변수를 계산하지 않아도 각 함수 호출은 스택에서 64 바이트를 소비합니다 (32 비트 프로세서, CPU 레지스터, 플래그의 절반 절약 등).
  • 호출 트리를 얕게 유지합니다 (위의 설명과 유사).

웹 서버

스택을 제어하거나 볼 수 있는지 여부는 보유한 '샌드 박스'에 따라 다릅니다. 웹 서버를 다른 높은 수준의 언어 및 운영 체제처럼 취급 할 수있는 가능성이 높습니다. 대부분 손에 닿지 않지만 사용중인 언어 및 서버 스택을 확인하십시오. 이다 예를 들어, SQL 서버의 스택을 날려 버릴 수있다.

-아담


8

실제 코드에서 스택 오버플로는 거의 발생하지 않습니다. 그것이 발생하는 대부분의 상황은 종료가 잊혀진 재귀입니다. 그러나 매우 중첩 된 구조, 예를 들어 특히 큰 XML 문서에서는 거의 발생하지 않을 수 있습니다. 여기서 유일한 도움은 호출 스택 대신 명시 적 스택 객체를 사용하도록 코드를 리팩터링하는 것입니다.


7

대부분의 사람들은 종료 경로가없는 재귀로 스택 오버플로가 발생한다고 말할 것입니다.하지만 대부분의 경우 충분한 데이터 구조로 작업하는 경우 적절한 재귀 종료 경로가 도움이되지 않습니다.

이 경우 몇 가지 옵션 :


7

Jeff와 Joel이 기술 질문에 대한 답을 얻을 수있는 더 나은 장소를 제공하고자 할 때 스택 오버플로가 발생합니다. 이 스택 오버플로를 방지하기에는 너무 늦었습니다. 그 "다른 사이트"는 은밀하지 않음으로써이를 막을 수있었습니다. ;)


6

무한 재귀는 스택 오버플로 오류를 얻는 일반적인 방법입니다. 방지하기 위해 - 항상 확인하는 것은 반드시 출구 경로있을 것입니다 타격을받을. :-)

스택 오버플로를 얻는 또 다른 방법 (적어도 C / C ++에서는)은 스택에 엄청난 변수를 선언하는 것입니다.

char hugeArray[100000000];

그렇게하겠습니다.


어떤 언어를 사용하고 있습니까? C에서는 거의 확실하게 스택 오버플로가 발생합니다. C #에서는 어레이가 스택이 아닌 힙에 할당되어 있기 때문이 아닙니다. 실제로 히트하는 예제는 다음 질문을 참조하십시오. stackoverflow.com/questions/571945/…
Matt Dillard

4

일반적으로 스택 오버플로는 무한 재귀 호출의 결과입니다 (요즘 표준 컴퓨터의 일반적인 메모리 양을 고려할 때).

메서드, 함수 또는 프로 시저를 호출 할 때 "표준"방식 또는 호출은 다음과 같이 구성됩니다.

  1. 호출에 대한 반환 방향을 스택으로 푸시 (호출 후 다음 문장)
  2. 일반적으로 반환 값을위한 공간은 스택에 예약됩니다.
  3. 각 매개 변수를 스택으로 푸시 (순서는 각 컴파일러에 따라 다르며 일부는 성능 향상을 위해 CPU 레지스터에 저장되기도 함)
  4. 실제 전화를 겁니다.

따라서 일반적으로 이것은 매개 변수의 수와 유형 및 기계 아키텍처에 따라 몇 바이트가 걸립니다.

그러면 재귀 호출을 시작하면 스택이 커지기 시작한다는 것을 알 수 있습니다. 이제 스택은 일반적으로 힙과 반대 방향으로 증가하는 방식으로 메모리에 예약되어 있으므로 "돌아 오지 않는"많은 호출이 주어지면 스택이 가득 차기 시작합니다.

이제 예전에는 사용 가능한 모든 메모리를 소진했기 때문에 스택 오버플로가 발생할 수 있습니다. 범위를 벗어난 가상 메모리 모델 (X86 시스템에서 최대 4GB)의 경우 일반적으로 스택 오버플로 오류가 발생하면 무한 재귀 호출을 찾습니다.


4

뭐? 무한 루프에 걸린 사람들을 사랑하는 사람이 없습니까?

do
{
  JeffAtwood.WritesCode();
} while(StackOverflow.MakingMadBank.Equals(false));

2
이것은 무한 반복하지 스택 오버플
에디 커티스

3

직접 재귀 (예 :)에서 얻은 스택 오버플로의 형태를 제외하고 Fibonacci(1000000), 제가 ​​여러 번 경험 한보다 미묘한 형태는 간접 재귀입니다. 여기서 함수는 다른 함수를 호출하고 다른 함수를 호출 한 다음 이러한 함수는 첫 번째 함수를 다시 호출합니다.

일반적으로 이벤트에 대한 응답으로 호출되지만 자체적으로 새 이벤트를 생성 할 수있는 함수에서 발생할 수 있습니다. 예를 들면 다음과 같습니다.

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

이 경우에 대한 호출로 ResizeWindow인해 스택이 부족해질 때까지 WindowSizeChanged()콜백이 다시 트리거 ResizeWindow될 수 있습니다. 이와 같은 상황에서는 스택 프레임이 반환 될 때까지 (예 : 메시지 게시) 이벤트에 대한 응답을 연기해야하는 경우가 많습니다.


2

이것이 "해킹"태그가 붙은 것을 고려할 때, 그가 언급 한 "스택 오버플로"는 여기 대부분의 다른 답변에서 참조 된 것과 같은 상위 수준 스택 오버플로가 아니라 호출 스택 오버플로라고 생각합니다. 웹 앱이 일반적으로 작성되는 .NET, Java, Python, Perl, PHP 등과 같은 관리 또는 해석 환경에는 실제로 적용되지 않으므로 유일한 위험은 웹 서버 자체입니다. C 또는 C ++.

이 스레드를 확인하십시오.

/programming/7308/what-is-a-good-starting-point-for-learning-buffer-overflow


1

가장 일반적인 피보나치 수 즉 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을 저하시키려는 의도가 전혀 없습니다. 스택 오버플로 문제가 의심되는 경우 재귀를 제한하거나 멀리하는 것이 제 의도입니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.