2020.01.25再帰関数ってややこしいですよね。この記事では再帰関数について、シンプルな例題を実際にPythonでプログラミングしながら解説していきます。解説は以下の書籍を参考にしています。プログラミングの一般教養が楽しく学べるおすすめの一冊です。本書は、プログラミング言語が持つ各種概念が「なぜ」存在するのかを解説する書籍です。世の中にはたくさんのプログラミング言語があります。プログラミングに関する概念も、関数、型、スコープ、クラス、継承など、さまざまなものがあります。多くの言語で共通して使われる概念もあれば、一部の言語でしか使われない概念もあります。これらの概念は、なぜ生まれたのでしょうか。本書のテーマは、その「なぜ」を理解することです。再帰関数って何?例題:入れ子リストの数値を全部足し合わせる再帰関数って何?そもそも再帰関数とは何かというと再帰呼び出し(ある関数Xの中から関数X自体を呼び出す処理)を行う関数です。再帰関数が無いとプログラムが書けないということはまず無いですが、これが使えるととても便利です。具体的には、「ある関数で処理を行っている最中に、その関数で行っている同じ処理を”別の対象(引数)”に対しても行いたい」という要望に応えてくれます。この説明だけでは、何のことかよく分からないので、具体的な問題で考えていきましょう。4]というリストの中にリストがあるような、入れ子のリストに含まれる数字を全部足す問題を考えます。4]に含まれる数字の合計を計算するプログラムをどうやって書きましょう。4]は2重の入れ子なので、forの2重ループで頑張れば解けそうです。これが3重、4重になったらどうでしょう?その度にforループを増やすのは現実的じゃないですね。そこで再帰呼び出しを使って、合計値を計算するプログラムを書きましょう。resultこれはリストを引数にとって、そのリストをfor文で回し、その要素が整数か否かで処理を変える関数です。関数中のifでitemが整数の場合の場合に、resultに足し合わせる処理をしています。else(itemが整数ではない場合)の処理は何もしていない(passしている)ので、これでは当然正しい合計値の計算ができません。以下のような結果になってしまいます。calculate_total(nested_list)5ではpassの部分をどう変更したら良いでしょうか。いま私たちは、itemが整数ではない(この問題ではitemがリストのとき)の処理を考えています。ここでやるべきことは、リストを引数にとって、そのリストの要素が整数の場合には、その合計値を計算することです。ここで重要なことに気がつきます。私たちが今書いている関数calculate_total()は、まさにそれと同じ処理をしようとしているものでした。リストを引数にとって、その要素が整数の場合にそれらの値を足し合わせる処理です。このelseの中でも、この関数自身を呼び出して使ってしまえば良いのです。すると、リストの要素にリストが含まれる限り、再帰的に合計を求めるための処理をしてくれるようになります。calculate_total(nested_list)10このように正しく計算することができました。この関数はネストが3重4重になっても、問題無く動きます。ここで1つ気をつけたいのは、elseの中で関数calculate_total()を呼び出す時に、その戻り値をresultに足し込むのを忘れないことです。意外と忘れてしまうので要注意です。以上で、再帰関数の説明はおしまいです。お付き合い頂き、ありがとうございました。Pythonの備忘録です。for文でのリストの反復処理で、現在の要素の添字を使うことがよくあります。range(len(flavor_...PythonmultiprocessingでBeautifulSoupのオブジェクトを扱おうとしたらRecursionErrorが発生した時の対処法。BeautifulSoup4によるウェブスクレイピングで、multiprocessingを使って並列処理するときに嵌ったエラーの対処法。今日はPythonで改行されているテキストファイルの1行1行を要素とするリストを作成する方法のメモです。文字列で見ると何の話か分かりにくいので、とりあえず状況を整理します。以下のように1行1行に文字列が含まれている、test.tx...Python【Python】緑本こと『データ解析のための統計モデリング入門』を実装していく【第3章その2】みどり本第3章の例題続きです。前回は例題のデータを分析して、以下のような特徴が得られたのでした。今回はこういった特徴を考慮しながら統計モデルを作っていきます。体サ...Pythoncategorical_crossentropyとsparse_categorical_crossentropyの違い【Keras】ニューラルネットワークのライブラリKerasにはいくつかの損失関数が実装されています。pytestを実行しようとすると、身に覚えのない以下のようなエラーが発生する。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。メーカーの研究所に入所。研究や開発に従事しており、普段はプログラミングをしたり論文を読んだりしています。ブログは趣味の学びのアウトプットです。本ブログが何かのお役に立ちましたら幸いです。研究所で働くエンジニアのブログ.。