プログラミング入門II
2024.06.12
関数 その2
今回もエラーが出るプログラムが提出されてしまいました.自分で実行してわかるはずなので,エラーの原因を見つけて,対処してから提出してください.提出されても採点しませんので,出しても無駄です. 実行時エラー: b2325 さて,今回は課題を提示する際に特に言及していませんでしたので,解答例に示すように2種類の考え方がありました.本来は右の解答例のように厳密に日数を求めるのが良いのかもしれませんが,再帰の練習のための問題ですので,左のような半減期の倍数の日数で答えるものでも問題ありません. 以下は例によって問題のあるプログラムの例です.参考にしてください.
bact = random.randint(3, 20)
print(f'{bact}')
def ster(n):
if n == 0:
return bact
else:
return ster(n-1) / 2
変数名には適切なものをつけるようにと指示していますが,前回の宿題で使用した変数名をそのまま使用するのはダメでしょう.なぜなら bact というのは bacteria から持ってきたものですし,ster は sterilize で消毒という意味ですよ.
print(f'Days to below 1/8 for iodine-131 radioactivity:{n}') |
相変わらず綴りの例文の意味を理解していないケースが見られます.上の 1/8 は実際に乱数で発生させた数でないと意味が無いです.
print(f'Days to below 1/{num}for idoine-131radioactivity:{n}') |
英語は分かち書きの言語なので,スペースは重要ですと,何度も言っています.ちゃんとしてください.
def decay(amount, days=0): if amount <= n_amount: return days else: return decay(amount / 2, days + half_day) |
上のものも今回はだいぶ減ったとはいえ,まだまだ複数出ていました.漸化式っぽいと言えばそうですが,まず普通に a(n) = f(a(n-1)) になる形が想像できませんかね.
amount = random.randint(3,20) def decrease(n): if n == 0: return amount else: return decrease(n - 1) / 2 |
なんで 3 から 20 まで乱数で出した値を返す?
def days(m): def half(n): amount = 0.5 ** (n / 8) if amount <= m: return n else: return half(n + 8) return half(0) |
なぜ 8 を足す?
def radi(n): if n == 0: return a else: return radi(n - 1) / 8 |
なぜ 8 で割る? 半減期の意味が理解できていない人も結構見られました.放射性廃棄物が年々溜まっていくこの国ですので,理系でしかも物理を勉強している学生であれば,半減期くらいは理解しておきましょう.
def days(n): if n == 3: return 16 elif n > 2 ** (days(n - 1) / 8): return 8 + days(n - 1) else: return days(n - 1) |
elif は無くても書けますね.
さて,以下の2つは絶対にやっちゃダメ!なものです.ひたすら場合分けしたり,自分で 16 日とかの答えを用意しちゃだめですよ.
def decrease(n): if (n-1) // 2 < 1: return 8 if (n-1) // 2 < 2: return decrease(n - 1) + 4 if (n-1) // 2 < 4: return decrease(n - 1) + 2 if (n-1) // 2 < 8: return decrease(n - 1) + 1 if (n-1) // 2 < 10: return decrease(n - 1) + 0.5 else: print() |
def day(n): if n == 3: return 16 elif n % 4 == 0: return 8 * (n // 4 + 1) else: return 8 * (n // 4 + 2) |
前回は関数を引き続き学習しました.中でも,高階関数のところで紹介されていたラムダ式や map 関数,filter 関数が重要となります.今回も引き続き演習問題で確認していきましょう.
関数の呼び出しや戻り値,再帰などの基本的な方法に加えて,Python 特有の map 関数など,今回も扱いますので,わかりにくいとは思いますが,頑張ってやっていきましょう.ラムダ式の中に条件分岐を入れる方法についても演習で扱います.また,map 関数や filter 関数はリストのように複数の値を持つオブジェクトに対して,反復処理を使用しなくても要素にアクセスできますので,プログラムを簡単にするのに役立ちます.
今回の演習問題です.
いつものようにレポート提出システムを利用します.授業当日の18:00から閲覧可能で,締切りは翌週火曜日の10:00です.
次回は教科書の p.296 - p.310 を扱います.予習をしておきましょう.