第9回 ユーザー定義関数 (2)

本題に入る前に必ず連絡の動画を見てください。
Google Colabへのリンク

1. 再帰関数

概要

動画の解説を参照

第6回で見たように、mathモジュールの factorial関数では階乗 (\(5! = 5\times4\times3\times2\times1\) のようなもの) を計算することができます。

いままでに出てきたことを使って、この計算を行う関数を作ると、例えばこのようになります。
これは結構複雑な形ですが、

このように自分で自分を呼び出すようにすれば、簡単な形になります。
このような関数を再帰関数といいます。

ほかにも、例えばリストや普通の整数、リストのリストなどを要素として含む複雑なリストの中の要素の数を数える関数なども、再帰を使えば比較的簡単に作れます。

課題1

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


1, 2,... n の総和を求める再帰関数、sumを作り、その関数を使って 1~ の総和を表示するコードを書いてください。
※ 総和は数学の公式 \(\displaystyle{\sum_{k=1}^{n}}k = \frac{n(n+1)}{2}\) から求めることもできますが、ここでは再帰を使って関数を記述してください。

2. 高階関数とラムダ式

動画の解説を参照

Pythonでは、引数として関数を受け取ることもできます。
たとえば、数式を表示する show_equation関数を作る場合は、計算結果と演算子 (計算の記号) を返す関数を受け取ればこのように計算の種類に応じて別の関数を受け取るだけで済みます。

show_equation関数を呼ぶには、計算結果と演算子を返す関数を引数として渡す必要がありますが、 ラムダ式 (無名関数 or 匿名関数) を使うと、sumなどの関数を記述しなくても「間に合わせの関数をその場で作って渡す」ことができます。
「lambda」の後に引数、: の後に戻り値を書きます。

課題2

引数 b が負の場合でも正しい表示になるように上の解説の show_equation関数を改良し、 の加減乗除の式を表示するコードを書いてください。
(例)

3. ジェネレーター

動画の解説を参照

関数と似たものとしてジェネレーターというものがあります。
普通の関数で戻り値を返すのは「return」ですが、ジェネレーターでは「yield」で戻り値を返します。
関数では「return」で値を返すとともに処理が終了するのでそれ以降の文は実行されませんが、ジェネレーターでは「yield」で値を返したあと、処理が一時停止します。
ふたたびジェネレーターが呼ばれると、処理はその後から始まります。
そのため、例えばこのようなコードを実行すると、get_number は順に「0」「1」「2」を返します。
正確にいうとジェネレーターの戻り値は値そのものではなくGeneratorオブジェクトです。
そのため、それ自体を表示しようとするとこのようになります。
もうちょっとジェネレーターの実用的な例を考えてみます。
たとえば引数を受け取って、それが素数かどうかを判定する (普通の) 関数はこのように書けます。

これを使って、2からnまでの範囲の素数を順に返すジェネレーターget_prime_numbersを作れます。

課題3

get_prime_numbersを「n 以上の素数を小さい順に c 個まで返す」ように修正し、それを使って自分の学籍番号以上の10個の素数を表示するようなコードを記述してください。
(実行例)

提出

今回作成したノートブックを「plang2024a@gmail.com」と共有してください。
※ 課題の再提出の際は、ノートブックの再度の共有はせずにチャットで連絡してください。