簡單的在某一區間迴圈遍歷的方法
阿新 • • 發佈:2018-12-16
# -*- 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