파ì�´ì„ ¶
파ì�´ì„ 으로 재귀호출ì�„ 한번 구현해보았으나, ì—„ì² ëŠ�리다.
~cpp
def TreeNPlusOne(aNumber):
print aNumber,
if aNumber == 1:
return
elif aNumber%2 == 0:
aNumber /= 2
else:
aNumber = 3*aNumber+1
TreeNPlusOne(aNumber)
ì•Œê³ ë¦¬ì¦˜ ¶
1. 22ì�˜ 경우 22, 11, 34...ì�´ë ‡ê²Œ ë�˜ëŠ”ë�° 22ì�˜ 싸ì�´í�´ 안ì—� 11, 34등ì�˜ 싸ì�´í�´ë�„ í�¬í•¨ë�˜ë‹ˆ 최대값ì—�서 그들ì�„ ë°°ì œí•˜ëŠ” 것ì�´ 가능하다.
2. 범위 안ì—� 어떤수ì�˜ 2ì�˜ 배수가 있는 경우(ë˜�는 (x - 1)/3ì�´ 있는 경우) 1ê³¼ ê°™ì�€ ì�´ìœ 로 ê·¸ 수는 최대값ì—�서 ë°°ì œí•œë‹¤.
2. 범위 안ì—� 어떤수ì�˜ 2ì�˜ 배수가 있는 경우(ë˜�는 (x - 1)/3ì�´ 있는 경우) 1ê³¼ ê°™ì�€ ì�´ìœ 로 ê·¸ 수는 최대값ì—�서 ë°°ì œí•œë‹¤.
범위(Range)를 ì�¸ìœ„ì �으로 줄여야한다는 ê²°ë¡ ì—� ë�„달.
소스 ¶
~cpp
def TreeNPlusOne(aNumber, aMin, aMax, aBinaryMap):
count = 1
while(aNumber != 1):
if(IsInRange(aMin, aMax, aNumber) and aBinaryMap[aNumber-aMin]):
aBinaryMap[aNumber-aMin] = False
if(aNumber%2 == 0):
aNumber = aNumber/2
else:
aNumber = aNumber*3+1
count = count + 1
return count
def InputRange():
min, max = input('최소, 최대: ')
while IsCorrectInput(min, max) == False:
min, max = input('최소, 최대: ')
return min, max
def MakeBinaryMap(aMin, aMax):
rangeOfMap = aMax - aMin + 1
binaryMap = range(rangeOfMap)
for i in range(rangeOfMap):
binaryMap[i] = True
return binaryMap
def FindMaxCycleLength(aMin, aMax, aBinaryMap):
maxCycleLength = 0
for i in range(aMin, aMax+1):
if(aBinaryMap[i-aMin]):
cycleLength = TreeNPlusOne(i, aMin, aMax, aBinaryMap)
if(maxCycleLength < cycleLength):
maxCycleLength = cycleLength
return maxCycleLength
def OutputResult(aMin, aMax, aMaxCycleLength):
print aMin, aMax, aMaxCycleLength
def IsInRange(aMin, aMax, aNumber):
if(aMin <= aNumber and aMax >= aNumber):
return True
else:
return False
def PreInspection(aMin, aMax, aBinaryMap):
for i in range(aMin, aMax/2+1):
tempI = i
while(IsInRange(aMin, aMax, 2*tempI)):
aBinaryMap[tempI-aMin] = False
tempI = 2*tempI
def IsCorrectInput(aMin, aMax):
if(aMin > 0 and aMax < 1000000 and aMin < aMax):
return True
else:
print 'Not Accept'
return False
if __name__ == '__main__':
min, max = InputRange()
binaryMap = MakeBinaryMap(min, max)
PreInspection(min, max, binaryMap)
OutputResult(min, max, FindMaxCycleLength(min, max, binaryMap))










