読者です 読者をやめる 読者になる 読者になる

Problem 1 - Project Euler

Project Euler - PukiWiki

面白そうだったのでこれから少しずつ挑戦していこうと思います。

まずは1問目

10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。

同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。

もちろんPythonで解こうと思うのですが、最近Schemeとかかじっちゃってるのでせっかくだし普通のループではなくて再帰で解いてみようと思ったのでした。


何度かの修正を経て出来上がったのがこちら…!

def Euler1(n, ans=0):
    if n == 0:
        return ans
    elif n % 3 == 0:
        return Euler1(n - 1, ans + n)
    elif n % 5 == 0:
        return Euler1(n - 1, ans + n)
    else:
        return Euler1(n - 1, ans)

ドヤ顔で実行こんなんでました。

RuntimeError: maximum recursion depth exceeded

どうやら「最大再帰深度を超えているよ」ってことらしい。そういえばどこかでPythonの再帰は回数制限があるとか見た記憶あるや…。

調べてみたところ、この最大再帰深度はsysモジュールのsetrecursionlimitという関数で変えられるみたい。

>>> import sys
>>> sys.setrecursionlimit(1100) # 1000だとまだだめだったので適当に。
>>> Euler1(999)
233168


解けた!