<p>我想我明白了。在</p>
<p>首先,基于您的想法的代码:</p>
<pre><code>import time
lastResult = 100
def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]):
runs = 0
SEEN = set()
while True:
if ID>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>lastResult,)
break
runs += 1
if runs % 10 == 0: time.sleep(0.5)
if ID in SEEN:
print ' -\nID=='+str(ID)+' already seen, not examined'
ID += 1
else:
curRes = isValid(ID)
if curRes:
print ' \nID=='+str(ID)+' vaaaalid'
while True:
for i in diff:
runs += 1
if runs % 10 == 0: time.sleep(0.5)
curRes = isValid(ID+i)
SEEN.add(ID+i)
if curRes:
print ' i==%2s ID+i==%s valid' % (i,ID+i)
ID += i
print ' \nID==%s' % str(ID)
break
else:
print ' i==%2s ID+i==%s not valid' % (i,ID+i)
else:
ID += 1
break
else:
print ' \nID==%s not valid' % ID
ID += 1
def isValid(ID, valid_ones = (1,9,17,25,50,52,60,83,97,98)):
return ID in valid_ones
checkNextID(0)
</code></pre>
<p>结果</p>
^{pr2}$
<p>一。在</p>
<p>以下是基于我想法的代码:</p>
<pre><code>import time
lastResult = 100
def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]):
runs = 0
maxdiff = max(diff)
others = [x for x in xrange(1,maxdiff) if x not in diff]
lastothers = others[-1]
SEEN = set()
while True:
if ID>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>lastResult,)
break
runs += 1
if runs % 10 == 0: time.sleep(0.5)
if ID in SEEN:
print ' -\nID=='+str(ID)+' already seen, not examined'
ID += 1
else:
curRes = isValid(ID)
if curRes:
print ' \nID=='+str(ID)+' vaaaalid'
while True:
for i in diff:
runs += 1
if runs % 10 == 0: time.sleep(0.5)
curRes = isValid(ID+i)
SEEN.add(ID+i)
if curRes:
print ' i==%2s ID+i==%s valid' % (i,ID+i)
ID += i
print ' \nID==%s' % str(ID)
break
else:
print ' i==%2s ID+i==%s not valid' % (i,ID+i)
else:
for j in others:
if ID+j>lastResult:
print '\n j==%2s %s+%s==%s>lastResult==%s is %s' \
% (j,ID,j,ID+j,lastResult,ID+j>lastResult)
ID += j
print '\n \nnow ID==',ID
break
runs += 1
if runs % 10 == 0: time.sleep(0.5)
curRes = isValid(ID+j)
SEEN.add(ID+j)
if curRes:
print ' j==%2s ID+j==%s valid' % (j,ID+j)
ID += j
print ' \nID=='+str(ID)
break
else:
print ' j==%2s ID+j==%s not valid' % (j,ID+j)
if j==lastothers:
ID += maxdiff + 1
print ' ID += %s + 1 ==> ID==%s' % (maxdiff,ID)
break
elif ID>lastResult:
print ' ID>lastResult==%s>%s is %s ==> WILL STOP' % (ID,lastResult,ID>lastResult)
break
else:
print ' -\nID=='+str(ID)+' not valid'
ID += 1
def isValid(ID, valid_ones = (1,9,17,25,50,52,60,83,97,98)):
return ID in valid_ones
checkNextID(0)
</code></pre>
<p>结果</p>
<pre><code> -
ID==0 not valid
ID==1 vaaaalid
i== 8 ID+i==9 valid
ID==9
i== 8 ID+i==17 valid
ID==17
i== 8 ID+i==25 valid
ID==25
i== 8 ID+i==33 not valid
i==18 ID+i==43 not valid
i== 7 ID+i==32 not valid
i==17 ID+i==42 not valid
i== 6 ID+i==31 not valid
i==16 ID+i==41 not valid
i== 5 ID+i==30 not valid
i==15 ID+i==40 not valid
j== 1 ID+j==26 not valid
j== 2 ID+j==27 not valid
j== 3 ID+j==28 not valid
j== 4 ID+j==29 not valid
j== 9 ID+j==34 not valid
j==10 ID+j==35 not valid
j==11 ID+j==36 not valid
j==12 ID+j==37 not valid
j==13 ID+j==38 not valid
j==14 ID+j==39 not valid
ID += 18 + 1 ==> ID==44
-
ID==44 not valid
-
ID==45 not valid
-
ID==46 not valid
-
ID==47 not valid
-
ID==48 not valid
-
ID==49 not valid
ID==50 vaaaalid
i== 8 ID+i==58 not valid
i==18 ID+i==68 not valid
i== 7 ID+i==57 not valid
i==17 ID+i==67 not valid
i== 6 ID+i==56 not valid
i==16 ID+i==66 not valid
i== 5 ID+i==55 not valid
i==15 ID+i==65 not valid
j== 1 ID+j==51 not valid
j== 2 ID+j==52 valid
ID==52
i== 8 ID+i==60 valid
ID==60
i== 8 ID+i==68 not valid
i==18 ID+i==78 not valid
i== 7 ID+i==67 not valid
i==17 ID+i==77 not valid
i== 6 ID+i==66 not valid
i==16 ID+i==76 not valid
i== 5 ID+i==65 not valid
i==15 ID+i==75 not valid
j== 1 ID+j==61 not valid
j== 2 ID+j==62 not valid
j== 3 ID+j==63 not valid
j== 4 ID+j==64 not valid
j== 9 ID+j==69 not valid
j==10 ID+j==70 not valid
j==11 ID+j==71 not valid
j==12 ID+j==72 not valid
j==13 ID+j==73 not valid
j==14 ID+j==74 not valid
ID += 18 + 1 ==> ID==79
-
ID==79 not valid
-
ID==80 not valid
-
ID==81 not valid
-
ID==82 not valid
ID==83 vaaaalid
i== 8 ID+i==91 not valid
i==18 ID+i==101 not valid
i== 7 ID+i==90 not valid
i==17 ID+i==100 not valid
i== 6 ID+i==89 not valid
i==16 ID+i==99 not valid
i== 5 ID+i==88 not valid
i==15 ID+i==98 valid
ID==98
i== 8 ID+i==106 not valid
i==18 ID+i==116 not valid
i== 7 ID+i==105 not valid
i==17 ID+i==115 not valid
i== 6 ID+i==104 not valid
i==16 ID+i==114 not valid
i== 5 ID+i==103 not valid
i==15 ID+i==113 not valid
j== 1 ID+j==99 not valid
j== 2 ID+j==100 not valid
j== 3 98+3==101>lastResult==100 is True
now ID== 101
ID>lastResult==101>100 is True ==> WILL STOP
==========================
ID==101
ID>lastResult is True : program STOPS
</code></pre>
<p>有</p>
<pre><code> if ID in SEEN:
print ' -\nID=='+str(ID)+' already seen, not examined'
ID += 1
</code></pre>
<p>在这段代码中,但是消息<strong>“already seen”</strong>在执行过程中从不打印;但是,valids ID的检测有相同的结果;这意味着在我的代码中不需要使用set seen。在</p>
<p>一。在</p>
<h2>编辑1</h2>
<p>代码#1与指令定期清空SEEN</p>
<pre><code>import time
lastResult = 100
def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]):
runs = 0
SEEN = set()
while True:
if ID>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>lastResult,)
break
runs += 1
if runs % 10 == 0: time.sleep(0.5)
if ID in SEEN:
print ' -\n%s\nID==%s already seen, not examined' % (SEEN,ID)
ID += 1
else:
curRes = isValid(ID)
if curRes:
print ' \n%s\nID==%s vaaaalid' % (SEEN,ID)
while True:
for i in diff:
runs += 1
if runs % 10 == 0: time.sleep(0.5)
curRes = isValid(ID+i)
print ' '+str(SEEN)
if i==diff[0]:
SEEN = set([ID+i])
else:
SEEN.add(ID+i)
if curRes:
print ' i==%2s ID+i==%s valid' % (i,ID+i)
ID += i
print ' \nID==%s' % str(ID)
break
else:
print ' i==%2s ID+i==%s not valid' % (i,ID+i)
else:
ID += 1
break
else:
print ' \n%s\nID==%s not vaaaaalid' % (SEEN,ID)
ID += 1
def isValid(ID, valid_ones = (1,9,17,25,30,50,52,60,83,97,98)):
return ID in valid_ones
checkNextID(0)
</code></pre>
<p>结果</p>
<pre><code>
set([])
ID==0 not vaaaaalid
set([])
ID==1 vaaaalid
set([])
i== 8 ID+i==9 valid
ID==9
set([9])
i== 8 ID+i==17 valid
ID==17
set([17])
i== 8 ID+i==25 valid
ID==25
set([25])
i== 8 ID+i==33 not valid
set([33])
i==18 ID+i==43 not valid
set([33, 43])
i== 7 ID+i==32 not valid
set([32, 33, 43])
i==17 ID+i==42 not valid
set([32, 33, 42, 43])
i== 6 ID+i==31 not valid
set([32, 33, 42, 43, 31])
i==16 ID+i==41 not valid
set([32, 33, 41, 42, 43, 31])
i== 5 ID+i==30 valid
ID==30
set([32, 33, 41, 42, 43, 30, 31])
i== 8 ID+i==38 not valid
set([38])
i==18 ID+i==48 not valid
set([48, 38])
i== 7 ID+i==37 not valid
set([48, 37, 38])
i==17 ID+i==47 not valid
set([48, 37, 38, 47])
i== 6 ID+i==36 not valid
set([48, 36, 37, 38, 47])
i==16 ID+i==46 not valid
set([36, 37, 38, 46, 47, 48])
i== 5 ID+i==35 not valid
set([35, 36, 37, 38, 46, 47, 48])
i==15 ID+i==45 not valid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==31 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==32 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==33 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==34 not vaaaaalid
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==35 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==36 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==37 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==38 already seen, not examined
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==39 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==40 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==41 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==42 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==43 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==44 not vaaaaalid
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==45 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==46 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==47 already seen, not examined
-
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==48 already seen, not examined
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==49 not vaaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
ID==50 vaaaalid
set([35, 36, 37, 38, 45, 46, 47, 48])
i== 8 ID+i==58 not valid
set([58])
i==18 ID+i==68 not valid
set([58, 68])
i== 7 ID+i==57 not valid
set([57, 58, 68])
i==17 ID+i==67 not valid
set([57, 58, 67, 68])
i== 6 ID+i==56 not valid
set([56, 57, 58, 67, 68])
i==16 ID+i==66 not valid
set([66, 67, 68, 56, 57, 58])
i== 5 ID+i==55 not valid
set([66, 67, 68, 55, 56, 57, 58])
i==15 ID+i==65 not valid
set([65, 66, 67, 68, 55, 56, 57, 58])
ID==51 not vaaaaalid
set([65, 66, 67, 68, 55, 56, 57, 58])
ID==52 vaaaalid
set([65, 66, 67, 68, 55, 56, 57, 58])
i== 8 ID+i==60 valid
ID==60
set([60])
i== 8 ID+i==68 not valid
set([68])
i==18 ID+i==78 not valid
set([68, 78])
i== 7 ID+i==67 not valid
set([67, 68, 78])
i==17 ID+i==77 not valid
set([67, 68, 77, 78])
i== 6 ID+i==66 not valid
set([66, 67, 68, 77, 78])
i==16 ID+i==76 not valid
set([66, 67, 68, 76, 77, 78])
i== 5 ID+i==65 not valid
set([65, 66, 67, 68, 76, 77, 78])
i==15 ID+i==75 not valid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==61 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==62 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==63 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==64 not vaaaaalid
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==65 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==66 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==67 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==68 already seen, not examined
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==69 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==70 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==71 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==72 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==73 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==74 not vaaaaalid
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==75 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==76 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==77 already seen, not examined
-
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==78 already seen, not examined
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==79 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==80 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==81 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==82 not vaaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
ID==83 vaaaalid
set([65, 66, 67, 68, 75, 76, 77, 78])
i== 8 ID+i==91 not valid
set([91])
i==18 ID+i==101 not valid
set([91, 101])
i== 7 ID+i==90 not valid
set([90, 91, 101])
i==17 ID+i==100 not valid
set([90, 91, 100, 101])
i== 6 ID+i==89 not valid
set([89, 90, 91, 100, 101])
i==16 ID+i==99 not valid
set([99, 100, 101, 89, 90, 91])
i== 5 ID+i==88 not valid
set([99, 100, 101, 88, 89, 90, 91])
i==15 ID+i==98 valid
ID==98
set([98, 99, 100, 101, 88, 89, 90, 91])
i== 8 ID+i==106 not valid
set([106])
i==18 ID+i==116 not valid
set([106, 116])
i== 7 ID+i==105 not valid
set([105, 106, 116])
i==17 ID+i==115 not valid
set([105, 106, 115, 116])
i== 6 ID+i==104 not valid
set([104, 105, 106, 115, 116])
i==16 ID+i==114 not valid
set([104, 105, 106, 114, 115, 116])
i== 5 ID+i==103 not valid
set([103, 104, 105, 106, 114, 115, 116])
i==15 ID+i==113 not valid
set([103, 104, 105, 106, 113, 114, 115, 116])
ID==99 not vaaaaalid
set([103, 104, 105, 106, 113, 114, 115, 116])
ID==100 not vaaaaalid
==========================
ID==101
ID>lastResult is True : program STOPS
</code></pre>
<p>上面的代码显示了记录和清空已经看到的ID值的过程。这是一个很好的代码,因为该算法包括定期清空SEEN,因为在给定要测试的id数量的情况下,清空是必要的。在</p>
<p>但从一开始,我的观点是,在这个算法中,与SEEN有关的记录和测试指令在程序的每一步都会重复执行,这对性能有很大的影响。在</p>
<p>这就是为什么我认为应该有另一个算法没有这个缺点。我终于成功地写了这样一个替代代码,现在我们有两个代码,有两个不同的算法。在</p>
<p>关于你的问题,“你确定没有必要在第二个问题中使用所见的逻辑吗?”</em><br/>
我回答‘是的,我想我可以肯定’。用指令管理SEEN来运行我的代码#2的目的是在验证了什么是一个思想概念和一个概念算法之后,让我确定。如果你想确定,你必须这样做:
-从概念上和精确地研究算法
-尽可能多地写两个代码的执行过程,并比较它们的结果,只要你需要实验证明,改变lastResult,valid_one和diff的值
对我来说,只要没有矛盾的实际案例证明我的结论是错误的,这一点就结束了。在</p>
<h2>我继续另一个答案,因为这个答案中的字符数是有限的</h2>