我该如何修复这个算法?
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
你明白算法是如何运作的吗?我只是没有正确实施。
答案 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语句,它们实际上分别对应-1
和1
。
答案 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