给出随机整数和变换函数,经过一段时间的转换后,它会进入一个循环

时间:2013-07-26 02:49:43

标签: algorithm

这是一个派生问题,你可以参考original question, 我的问题是:给定10个随机整数(从0到9,重复允许)和变换函数ff就是这个(在python 3.3代码中):

def f(a):
    l = []
    for i in range(10):
        l.append(a.count(i))
return l

假设a是十个随机整数,执行f并将结果分配回a,重复此过程,几次之后,您将进入一个循环。 这就是说:a,a1 = f(a),a2 = f(a1)......,这个序列中有一个循环。

测试代码如下(来自@ user1125600的代码):

import random
# [tortoise and hare algorithm][2] to detect cycle
a = []
for i in range(10):
    a.append(random.randint(0,9))
print('random:', a)
fast = a
slow = a
i = 0
while True:
    fast = f(f(fast))
    slow = f(slow)
    print('slow:', slow, 'fast:', fast)
    i +=1
    # in case of running into an infinite loop, we are limited to run no more than 10 times
    if(i > 10):
        print('more than 10 times, quit')
        break
    if fast == slow:
        print('you are running in a cycle:', fast, 'loop times:', i)
        break

如何证明为什么存在一个循环呢?另一件有趣的事情是:查看测试结果,您会发现fastslow只会在三个点相遇:[7, 1, 0, 1, 0, 0, 1, 0, 0, 0][6, 3, 0, 0, 0, 0, 0, 1, 0, 0]以及{{ 1}}

1 个答案:

答案 0 :(得分:4)

必须有一个循环,因为f是一个函数(它总是为给定的输入产生相同的输出),并且因为函数的范围(可能的输出集)是有限的。由于范围是有限的,如果你反复将范围映射到自身,你必须最终获得你已经看到的一些价值。