给定整数N。任务是找到1到N-1之间的数字,该数字在其Collatz序列中具有最大的项数,并且在序列中具有最大的项数。
编号为N的collatz序列定义为:
- 如果N为奇数,则将N更改为3 * N +1 。
- 如果N为偶数,则将N更改为N / 2 。
例如,让我们看一下N = 13时的序列:
13-> 40-> 20-> 10-> 5> 16-> 8-> 4-> 2-> 1
例子:
Input: 10
Output: (9, 20)
9 has 20 terms in its Collatz sequence
Input: 50
Output: (27, 112)
27 has 112 terms
方法:
就像在上面针对N = 13讨论的示例中一样, N = 13和N = 40的collatz序列具有相似的术语,只有一个除外,这确保了可能涉及动态编程来存储子问题的答案并重新使用它。
但是这里正常的记忆是行不通的,因为第一步我们要么自成一个大数(在上面的示例中N = 13取决于N = 40的解)或除以2 (N = 40取决于解决方案的解) N = 20)。
因此,我们将使用Map /字典数据结构来存储子问题的解决方案,并执行collatz序列中讨论的常规操作,而不是使用dp数组。
下面是上述方法的实现:
def collatzLenUtil(n, collLenMap):
# If value already
# computed, return it
if n in collLenMap:
return collLenMap[n]
# Base case
if(n == 1):
collLenMap[n] = 1
# Even case
elif(n % 2 == 0):
collLenMap[n] \
= 1 \
+ collatzLenUtil(n//2, collLenMap)
# Odd case
else:
collLenMap[n] \
= 1 \
+ collatzLenUtil(3 * n + 1, collLenMap)
return collLenMap[n]
def collatzLen(n):
# Declare empty Map / Dict
# to store collatz lengths
collLenMap = {}
collatzLenUtil(n, collLenMap)
# Initalise ans and
# its collatz length
num, l =-1, 0
for i in range(1, n):
# If value not already computed,
# pass Dict to Helper function
# and calculate and store value
if i not in collLenMap:
collatzLenUtil(i, collLenMap)
cLen = collLenMap[i]
if l < cLen:
l = cLen
num = i
# Return ans and
# its collatz length
return (num, l)
print(collatzLen(10))
输出:
(9, 20)