操纵数字算法

时间:2011-05-19 20:25:16

标签: python

我该如何修复这个算法?

def change_num(n, direc, numMove):
    if direc == 'back':
        nums = range(10)
        return nums[n-numMove]
    elif direc == 'forward':
        nums = range(10)
        nums.reverse()
        return nums[n-numMove]-1 

这不适用于direc =='返回' 以下是一些预期回报样本:

0 1 2 3 4 5 6 7 8 9

change_num(1,'back', 5)  -> 6
change_num(5,'back', 1)  -> 4
change_num(7,'forward',5) -> 2
change_num(0,'forward',5) -> 5

你明白算法是如何运作的吗?我只是没有正确实施。

3 个答案:

答案 0 :(得分:4)

而不是'back''forward',将+1传递给前锋,-1传递回来更容易。然后你的函数简化为

def change_num(n, direc, num_move):
    return (n + direc * num_move) % 10

答案 1 :(得分:2)

def change_num(n, direc, numMove):
   d = {'back' : -1, 'forward' : 1}
   return (n + d[direc]*numMove) % 10

您是否考虑过此功能的作用?这个num列表毫无意义bc num[x] === x。你不需要'back'和'forward'的if语句,它们实际上分别对应-11

答案 2 :(得分:0)

您的功能过于复杂,无法在Python 3中使用。

% cat ./test.py
#!/usr/bin/env python

import unittest

def change_num(n, direc, numMove):
    directions = {
            'back': -1,
            'forward': +1,
            }
    steps = n + directions[direc] * numMove
    wrapped = steps % 10
    return wrapped

class TestChangeNum(unittest.TestCase):

    def test_back_no_wrap(self):
        self.assertEquals(6, change_num(1, 'back', 5))

    def test_back_with_wrap(self):
        self.assertEquals(4, change_num(5, 'back', 1))

    def test_forward_with_wrap(self):
        self.assertEquals(2, change_num(7, 'forward', 5))

    def test_forward_no_wrap(self):
        self.assertEquals(5, change_num(0, 'forward', 5))

if __name__ == '__main__':
    unittest.main()

% python test.py 
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK