私は大学の教員補佐です。次のトピックは再帰です。学生が概念を簡単に把握して再帰的に考えることができるように、再帰を教えるのに最適な方法はどれですか。
再帰を教えるためにスタック構造を説明することを考えていましたが、プロセスを追跡する際にスタックするのではないかと心配しています。ヒントはありますか?
私は大学の教員補佐です。次のトピックは再帰です。学生が概念を簡単に把握して再帰的に考えることができるように、再帰を教えるのに最適な方法はどれですか。
再帰を教えるためにスタック構造を説明することを考えていましたが、プロセスを追跡する際にスタックするのではないかと心配しています。ヒントはありますか?
回答:
再帰を教える私のお気に入りの方法は、再帰の妖精を参照することです。
ストーリーはアイデアを教えるための非常に効果的な方法であり得るという考えに、私たちは皆知っていると思います。人々は物語を聞いて覚えるように作られているようです。再帰の妖精は、ジェフエリクソンによって提案された説明であり、このアプローチに適しています。
ジェフE.が書いているように:
再帰は、特に強力な種類の削減であり、次のように大まかに説明できます。
- 問題の特定のインスタンスが小さいか十分に単純な場合は、それを解決します。
- それ以外の場合は、問題を同じ問題の1つ以上の単純なインスタンスに減らします。
自己参照が混乱している場合は、他のタイプの削減について想定しているように、誰かがより簡単な問題を解決しようとしていることを想像すると役に立ちます。他の誰かを再帰の妖精と呼びたいです。あなたの唯一の仕事は、元の問題を単純化すること、または単純化が不要または不可能な場合に直接それを解決することです。再帰妖精は魔法のうち、あなたのビジネスだから、バットのどれにいるん方法を使用して、あなたのためのすべてのシンプルな部分問題の世話をします1。数学的に洗練された読者は、再帰の妖精をより正式な名前である帰納仮説で認識するかもしれません。
1:学生時代、私は再帰を「再帰の妖精」ではなく「エルフ」に帰していました。グリム兄弟がベッドに行ったときに仕事を終えずに寝ているときに、目を覚ましたときにそれを発見するだけだった古い靴屋に関する話を参照しましたエルフ(「Wichtelmänner」)はすべてを一晩で終えました。私がテレンスマッケンナの「自己変身する機械のエルフ」と認識するよりも、神秘的に経験した人。
彼の再帰に関する講義ノート全体を読むことをお勧めします。それらは美しさのものであり、再帰を教える方法について多くの優れたアイデアを提供します。
たとえば、ハノイの塔に関する彼の説明をチェックしてください。彼は再帰によって問題を解決する方法を示しています。私が大好きな部分:
このパズルを解く秘訣は、再帰的に考えることです。パズル全体を一度に解くのではなく、最大のディスクだけを移動することに集中しましょう。[...]そして、私たちが移動した後番目のディスク、私たちはそれらを移動する必要があります その上に戻ってディスク。だから今私たちが理解しなければならないすべてはどのように...
やめる!!それでおしまい!終わったね!私たちは無事に削減しました-ハノイの塔の問題を()-ディスクハノイの塔の問題。これは、再帰の妖精に喜んで渡すことができます(または、元の話をさらに進めるために、寺院の若い僧侶に渡します)。
再帰の妖精への言及:Youtubeビデオ(「再帰は何かを解決する必要があるとき、あなたは他の人の代わりにあなたを呼びます!」「それで私は問題があるとき、私はそれを解決するように私に尋ねますか?」「理解するために再帰、再帰を理解する必要があります」)。分割統治は、再帰の妖精の軍隊です。
自明ではない再帰を説明する最良の方法は、一部の学生にとってはより「快適」な数学関数から始めることです。たとえば、フィボナッチ数列は2つの再帰呼び出しを使用するため、優れた例です。
別の例(簡単な演習として与えることができます)は、 。
次に、より複雑なデータ構造について、いくつかの「アルゴリズム」の例を示します。ここで最も自然な例は、ツリートラバーサル(プレオーダー、インオーダー、ポストオーダー)です。これらの例の後で、学生はそれのこつを理解すると思います。それ以降は、主に練習です。
スタック構造は後で使用するために保存します。これは、再帰が実際にコンピューターに実装される方法に関連しており、再帰の実際の概念とは関係が少ないためです。
Shaullの提案は適切です。覚えておくことが重要であり、基本的なアイデアは次のとおりであることを継続的に生徒に思い出させます。
問題を解決するには:(1)再帰が適用されない基本ケースに対処し、(2)小さな問題を解決し、より小さなソリューションを元のソリューションに適切に組み合わせて、他のすべてを解決します問題。
これは、計算などの数値問題に適しています (より小さな問題にはコンピューティングが含まれます )またはコンピューティング 繰り返し二乗を使用する(より小さい問題は基本的には計算です) )。
再帰と帰納は、特に再帰アルゴリズムの正確性を証明するとき、またはアルゴリズムのタイミング推定値を取得するときに、密接に関連しています。
もちろん、再帰はツリーの自然な手法ですが、リストについても忘れずに、数値のリストを再帰的に合計したり、リストを逆にしたりすることを忘れないでください。もちろん、mergesortはここでは自然な候補であり、リストを2つのほぼ等しい部分に分割する再帰的な実装や、マージ部分を再帰的に実装するなど、すべてを再帰的に実行することには価値があります。
強力な設計ツールであるだけでなく、再帰は非再帰的な解決策を思い付くのが非常に難しい問題があるため、再帰は検討に値することを指摘しておきます。これの良い例はハノイの塔です:再帰的ソリューションはシンプルで多かれ少なかれ透明ですが、非再帰的ソリューションは説明するのが本当に難しく、おそらくそもそも発明するのがさらに難しいでしょう。
再帰を教えるときは、関数または データ構造から始めるとよいでしょう。
私が教えていた頃を思い出してみると、昔は料理の構造であるタマネギから始めていました。それで、タマネギは孤独な皮(または穀粒)、またはその周りに皮をつけたオニオンのどちらかであると説明しました。次に、文字列や木などの他の構造に切り替えました。
それから私はこれらの構造のためのプログラムを書かなければなりませんでした。そして、構造の定義に従って、自然に再帰的に呼び出されました。ベースケースの概念もより自然に見え、アプローチでは、少なくとも最初は、問題の単純なインスタンスの概念を避けることができます。
これを数値データなどの他のデータに適用すると、より自然になります。