開発辞書


あなたは大きな複雑な問題を取ることができる場合は、わずかに小さいか簡単な問題を解決することによって解決する.
あなたが1を知っていると想像してください.わずかに小さいサイズの問題への解決策を計算します.と2 .その問題は、手に大きな問題への究極の解決策にサブソリューションを関連付けます.これはコンピュータプログラムにおける再帰の概念の本質である.再帰は具体的な例で最もよく説明されています.

例1 Fibonacciシーケンス


あなたは学校からのFibonacciシーケンスを覚えているかもしれません.これは、各番号は、前の2つの数字の合計である数字のシリーズです.1, 1, 2, 3, 5, 8, 13, 21, 34, 55これらは最初の10フィボナッチ数です.n番目のfibonacci番号を返す関数FIBを書くことを想像してください.したがって、N = 10の場合、それは55を返します.定義からこのように定義されます:fib(n) = fib(n-1) + fib(n-2)右側に、私たちが定義しようとしている同じ機能を呼んでいることに注意してください.これは再帰関数定義です.再帰的な関数の定義には2つのことがあります.これは小さい入力と同じ関数を呼び出し、ベースケースを定義します.上記は再帰関数呼び出しを示します.これは直感的にFibonacciシーケンスの定義から意味をなす.ベースケースは何ですか.
基本ケースは、関数が自分自身を呼び出すことなく値を返すことができる方法です.関数呼び出しのチェーンを終了する方法が必要だからです.この場合、ベースケースは「N = 1かN = 2のためにちょうど1を返す」と定義されることができます.基本ケースを定義するときは、再帰関数呼び出しを行わない.

上の図では、我々の目標は5番目のFibonacci数を計算することです.我々は直感的に我々は4と3 fibの番号を追加することができますし、答えを得る知っている.どのように、コンピュータプログラムは、それを再帰的にしますか?
オレンジ矢印はベースケースを表します.緑の数字を追加することができますし、'ロールアップ'前の関数の呼び出しに答えを得るための答えです.5番目のFIB番号を計算するためにFIB関数を8回呼び出すことができます.以下に関数定義を示します:
function fib(n) {
    if (n <= 2) return 1;

    return ( fib(n-1) + fib(n-2) );
}

例2:ハノイの塔


可能ならば、このTower of Hanoi gameをしてください.また、ディスクの数を増やすようにゲームが迅速に挑戦を取得する理由を経験します.
ハノイの塔の目的は、ペグCを一時的な格納場所として使用している間、ペグBを目標とするペグからディスクの全てを動かすことです.つの基本的なルールがあります:あなたは一度に1つのディスクを移動することができますし、いつでもより小さなディスクの上に大きなディスクを配置することはできません.
3つのディスクを持つタワーをイメージします.あなたは簡単に移動することができます、あなたは時間の前にすべてのステップを想像することができますし、動きを視覚化することができます.3台のディスクを動かすプロセスが10枚のディスクまたは25のディスクまたは50または100を動かすために外挿されることができると思っていますか?
しかし、我々の大部分は、時間の前に動きを想像することができないか、同時に我々の頭で彼ら全員を抱くことができません.3台のディスクの移動数は7です.4枚のディスクには15、5枚のディスクは31です.3つのディスクを越えたステップを想像することができないということは意味をなします.我々の脳が我々の短期記憶で4~7つのはっきりしたものを持つことができるだけであることが示されました.この場合、動きの数はディスクの数と共に指数関数的に増加する.
ハノイの塔に再帰の概念を適用すると、我々は我々が任意の数N(十分な時間と忍耐を与えられた)のためのゲームを解決することができると確信している論理的な場所に得ることができます!ここではどのように直感的に解決策について考えることができます:私たちは
  • は、ペグAからペグCへのN - 1ディスクを動かします.
  • それから、
  • はペグAからG .
    そして、ステップ561において、現在ペグC上のN - 1ディスクをペグB、目標ペグに動かすために、ステップ1で使用される同じプロセスを使用する.
  • あなたは、ゴールであったペグBの上のすべてのNディスクで終わります.
    この解決の本質は再帰の概念であることがわかる.それでは、ベースケースはどうですか?ベースケースはn=1ディスクである.まあそれは簡単な権利、我々はそれを拾って、それを移動します.それで、1つのディスクを動かす方法を知っているならば、あなたは言いますはい、それは正確です.これは直感的に満足していないかもしれませんが、それは本当です.100ディスクを移動するには、どのように99ディスクを移動する方法を知っている必要があります.しかし、99台のディスクを動かすには、どのようにディスクを動かすかを知る必要があります.3台のディスクを動かすためには、2台のディスクの移動方法を知る必要があります.アハ!そして、我々はそれをする方法を知っています.
    私たちは100ディスクを動かす方法を知っています、しかし、それは簡単であるか低い努力であることを意味しません.
    現在、プログラミングで再帰と呼ばれるものの本質を知っています.あなたはそれが非常に強力な概念であることがわかります.我々は想像したり、私たちの頭の中のソリューションの手順を保持することはできませんが、簡単にこのような問題を解決するためのコンピュータプログラムを書くことができます.