[Tutor] function remember calls?

Robert Johansson robert.johansson at math.umu.se
Tue Aug 9 09:44:49 CEST 2011


Hi all,

This is my attempt to generate all pairs of relatively prime pairs of nonnegative integers (n, m) such that n + m <= N, using the Stern-Brocot tree.

def rp_bounded_sum(n, i = 0, p = (0, 1), q = (1, 1), S = set([(0, 1), (1, 1)])):
    # Returns a set S with all relatively prime pairs (a, b)
    # such that 0 <= a <= b and a + b <= n.
    r = p[0] + q[0], p[1] + q[1]
    if r[0] + r[1] <= n:
        S.add(r)
        rp_bounded_sum(n, 1, p, r, S)
        rp_bounded_sum(n, 1, r, q, S)
    if not i:
        return S

Strangely, (to me) it seems that the function remembers the set S between different calls:

>>> T=rp_bounded_sum(200)
>>> len(T)
6117
>>> T=rp_bounded_sum(100)
>>> len(T)
6117

Why?

I modified it to

def rp_bounded_sum(n, i = 0, p = (0, 1), q = (1, 1), S = set()):
    # Returns a set S with all relatively prime pairs (a, b)
    # such that 0 <= a <= b and a + b <= n.
    if not i:
        S = set([(0, 1), (1, 1)])
    r = p[0] + q[0], p[1] + q[1]
    if r[0] + r[1] <= n:
        S.add(r)
        rp_bounded_sum(n, 1, p, r, S)
        rp_bounded_sum(n, 1, r, q, S)
    if not i:
        return S

Now it works fine but I don't understand why the first example fails. I'm not very pleased with any of these two solutions so I would be grateful for any suggestions of improvements. I use Python 2.7.2 under Windows 7 and I ran this in Python shell in IDLE.

Cheers, Robert

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110809/0940b5fd/attachment.html>


More information about the Tutor mailing list