📜  最大序列长度|柯拉兹猜想

📅  最后修改于: 2021-05-04 11:47:15             🧑  作者: Mango

给定整数N。任务是找到1N-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

例子:

方法:

就像在上面针对N = 13讨论的示例中一样, N = 13N = 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)