1. 程式人生 > >簡單的在某一區間迴圈遍歷的方法

簡單的在某一區間迴圈遍歷的方法

# -*- 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