[Tutor] Re: recursion question

Lee Harr missive at hotmail.com
Thu Dec 4 21:35:24 EST 2003


>>def mult(m, n):
>>    if n < 0:
>>        return -mult(m, -n)
>>    elif n == 0:
>>        return 0
>>    elif n == 1:
>>        return m
>>    else:
>>        return m + mult(m, n-1)
>>
>>
>>Now all we need to do is write a docstring and some regression tests
>>and we're all set  :o)
>
>Hmm... , do you think my version would also pass your regression test?
>
> >>> def mult(m, n):
>       if n < 0:
>           return -mult(m, -n)
>       elif n == 0:
>           return 0
>       else:
>           return m + mult(m, n-1)
>



def mult(m, n):
    if n == 0:
        return 0
    if n == 1:
        return m
    if n < 0:
        p = abs(n)
        result = -1 * (m + mult(m, p-1))
        return result
    return m + mult(m, n-1)


def mult2(m, n):
    if n < 0:
        return -mult(m, -n)
    elif n == 0:
        return 0
    elif n == 1:
        return m
    else:
        return m + mult(m, n-1)


def mult3(m, n):
      if n < 0:
          return -mult(m, -n)
      elif n == 0:
          return 0
      else:
          return m + mult(m, n-1)



import unittest

class TestMultFunction(unittest.TestCase):
    def setUp(self):
        self.this_mult = mult

    def test2positive(self):
        for n in range(1, 10):
            m = 20 - n
            self.assertEqual(self.this_mult(m, n), m*n)

    def test1positive1negative(self):
        for n in range(1, 10):
            m = -20 - n
            self.assertEqual(self.this_mult(m, n), m*n)

    def test2negative(self):
        for n in range(1, 10):
            m = -20 - n
            self.assertEqual(self.this_mult(m, -n), m*-n)

    def testmzero(self):
        m = 0
        for n in range(-10, 10):
            self.assertEqual(self.this_mult(m, n), m*n)

    def testnzero(self):
        n = 0
        for m in range(-10, 10):
            self.assertEqual(self.this_mult(m, n), m*n)

    def testlongs(self):
        for m in range(-10, 10):
            for n in range(-5, 5):
                lm = long(m)
                ln = long(n)
                self.assertEqual(self.this_mult(lm, ln), lm*ln)

            for n in range(5, -5, -1):
                lm = long(m)
                ln = long(n)
                self.assertEqual(self.this_mult(lm, ln), lm*ln)


# All 3 fail this one pretty miserably...
#
#     def testfloats(self):
#         for m in range(-100, 100):
#             for n in range(-50, 50):
#                 fm = float(m)/10
#                 fn = float(n)/10
#                 self.assertEqual(self.this_mult(fm, fn), fm*fn)
#
#             for n in range(50, -50, -1):
#                 fm = float(m)
#                 fn = float(n)
#                 self.assertEqual(self.this_mult(fm, fn), fm*fn)

# And this one too...
#
#     def testintfloat(self):
#         for m in range(-10, 10):
#             for n in range(-50, 50):
#                 fn = float(n)/10
#                 self.assertEqual(self.this_mult(m, fn), m*fn)
#
#             for n in range(50, -50, -1):
#                 fn = float(n)
#                 self.assertEqual(self.this_mult(m, fn), m*fn)

    # But this seems to be ok
    #
    def testfloatint(self):
        for m in range(-100, 100):
            for n in range(-5, 5):
                fm = float(m)/10
                self.assertEqual(self.this_mult(fm, n), fm*n)

            for n in range(5, -5, -1):
                fm = float(m)
                self.assertEqual(self.this_mult(fm, n), fm*n)


class TestMult2Function(TestMultFunction):
    def setUp(self):
        self.this_mult = mult2


class TestMult3Function(TestMultFunction):
    def setUp(self):
        self.this_mult = mult3


if __name__ == '__main__':
    # you can use this simple style
    #unittest.main()


    # or this style for more detail
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestMultFunction))
    suite.addTest(unittest.makeSuite(TestMult2Function))
    suite.addTest(unittest.makeSuite(TestMult3Function))
    unittest.TextTestRunner(verbosity=2).run(suite)

_________________________________________________________________
Add photos to your messages with MSN 8. Get 2 months FREE*. 
http://join.msn.com/?page=features/featuredemail




More information about the Tutor mailing list