# -*- coding:utf8 -*-
# 很多时候需要在离散区间[a, b]顺序遍历数字,比如现在有8张loading图,名字为loading_ui_1 -- loadding_ui_8
# 其中最后那个数字是变的,如果要轮播这些图,就相当于在离散区间[1, 8]遍历数字,当遍历到loading_ui_8的时候,下一个背景图应该是loading_ui_1
# 则问题可以转换为数学描述
# 离散区间[a, b]中有一个数字为i, 需要让i+1(其实i的任何加减运算都适用)仍然处于区间[a, b]
# 先分析, i 在 [a, b] 区间,
# 可以表示为 i-a 在 [0, b-a] (表示[0, x] 就是为了可以作%运算)
# 那么对于 i-a 的任何加减运算只要%(b-a+1)就可以保证变化后仍处于[0, b-a]区间
# 所以 ((i-a)+1)%(b-a+1) 代表把 i 在区间[a, b]上的 i+1 运算 映射到区间[0, b-a]上,
# 现在把这个值再映射回到区间 [a, b], 区间[0, b-a]到[a, b]只需要加上a,即有 (i-a+1)%(b-a+1)+a
# 更一般地对于所有i加减运算,用f(i)表示
# 则一般式为 f(i-a) % (b-a+1) + a
# 现在代码验证
# 区间循环遍历
def IntervalTraversal(i, a, b, func):
"""
@param i: 处于区间[a, b]的数
@param a: 区间[a, b]的下限
@param b: 区间[a, b]的上限
@param func: 对i的变化
@return:
"""
assert a <= i <= b and callable(func)
return func(i-a) % (b-a+1) + a
# example as follows
num = 3
print 'increase step by 1:'
for i in xrange(10):
num = IntervalTraversal(num, 1, 8, lambda n: n+1)
print num
num = 4
print 'decrease step by 2'
for i in xrange(10):
num = IntervalTraversal(num, 1, 8, lambda n: n-2)
print num