オーバーフローオーバーフロー

4505 ワード


再帰リフレッシュ
再帰はコードを書くための直感的できれいな方法を提供するので、コンピュータプログラミングの基本的な概念です.
私は最初の前に何かについての最初の前に私に対する私のポストに焦点を当てて、再帰について書きました.リフレッシュとして、再帰的なプログラムは、それ自体を呼び出すものです.これは“ベースケース”と“再帰ケース”で構成されています.我々はベースケースに到達するまで連続的な再帰的な呼び出しを行う.
ここでは、スタックの別の側面を探る.

スタック
呼び出しスタックは、プログラムのローカル実行コンテキストを保持する基になるデータ構造体と考えることができます.呼び出しスタックは、私たちのコード(キューFIFOデータ構造の反対側)で使用するスタックデータ構造の同じlifo(“last in first out”)プロパティを持っています.再帰的なプログラムが実行される方法を考えるとき、これは意味をなします:一旦ベースケースに達するならば、我々は出力を最も最近の再帰的な呼び出しに返して、そこから我々の解決を構築したいです.
呼び出しスタックはメモリに住んでいますが、ヒープとは異なり、サイズは有限で、自動的にOSによって管理されます.デフォルトでは、Mac OSのスタックサイズは8 MBです.
ulimit -a
MacBook Proでこのコマンドを実行すると、次のようになります.
// ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1392
virtual memory          (kbytes, -v) unlimited

オーバーフローオーバーフロー
大部分のプログラマーが2020年に「Stackoverflow」を聞くとき、我々の心は我々がそれほど多くの問題を解決するのを援助したQ & Aフォーラムにジャンプします.しかし、スタックオーバーフローは、再帰的なプログラムがあまりにも多くのフレームを開くときに発生する例外の型です.言い換えると、プログラムがスタックに割り当てられたメモリ制限を超える場合、この例外が表示されます.これは無限再帰に対する保護です-あなたのプログラムがバグを持っていて、再帰的なケースに決して届かないならば、それはこの例外に遭遇します.
スタックオーバーフローに遭遇するサンプルプログラムは、ここにありますRangeError ):
function helloWorld(i) {
  if (i == 1) {
    return "Hello";
  } else {
    return helloWorld(i);
  }
}
ここでのバグは、私たちの再帰的なケースが入力変数を変更しないので、ベースケースに到達しないことです.このプログラムを実行すると、次のようになります.
> helloWorld(2)
Thrown:
RangeError: Maximum call stack size exceeded
    at helloWorld (repl:1:20)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)
    at helloWorld (repl:5:8)

結論
我々のコードを実行するために使用される基礎となるデータ構造を理解することは、プログラマとしての我々の決定を知らせるのを助けることができます.そしてこの場合、プログラマのキットで最も一般的に使われているツールの一つとしてのネーミングについても理解できます.StackOverflow .

リソース
  • Recursion and stack

  • The JavaScript Call Stack - What It Is and Why It's Necessary - チャールズ・フリーボーン

  • Understanding Execution Context and Execution Stack in Javascript - サクジンダーアラー
  • Stack Overflow logo

  • Memory : Stack vs Heap - ポール・グリッブル