Maximum Sequence Length | Collatz Conjecture - GeeksforGeeks

26 Apr, 2022
Given an integer N. The task is to find the number in the range from 1 to N-1 which is having the maximum number of terms in its Collatz Sequence and the number of terms in the sequence.The collatz sequence of a number N is defined as:  
If N is Odd then change N to 3*N + 1.
If N is Even then change N to N / 2.
For example let us have a look at the sequence when N = 13: 13 -> 40 -> 20 -> 10 -> 5 > 16 -> 8 -> 4 -> 2 -> 1Examples:  
Input: 10 Output: (9, 20)9 has 20 terms in its Collatz sequenceInput: 50 Output: (27, 112) 27 has 112 terms  
 
Approach: As in the above example discussed for N = 13, collatz sequence for N = 13 and N = 40 have similar terms except one, that ensures there may be an involvement of dynamic programming to store the answer for subproblems and reuse it.But here normal memoization will not work because at one step we are either making a number large from itself ( in above example N = 13 is depending upon the solution of N = 40 ) or dividing by 2 ( N = 40 solution depends upon the solution of N = 20 ).So instead of using a dp array we will use a Map/ dictionary data structure to store the solution of subproblems and will perform the normal operation as discussed in the collatz sequence.Below is the implementation of the above approach: 
C++
Python3
Javascript
#include<bits/stdc++.h>using namespace std; int collatzLenUtil(int n, unordered_map<int,int>&collLenMap){   // If value already  // computed, return it  if(collLenMap.find(n) != collLenMap.end())    return collLenMap[n];   // Base case  if(n == 1)    collLenMap[n] = 1;   // Even case  else if(n % 2 == 0){    collLenMap[n] = 1 + collatzLenUtil(n/2 , collLenMap);  }   // Odd case  else{    collLenMap[n] = 1 + collatzLenUtil(3 * n + 1, collLenMap);  }   return collLenMap[n];} pair<int,int> collatzLen(int n){   // Declare empty Map / Dict  // to store collatz lengths  unordered_map<int,int>collLenMap;   collatzLenUtil(n, collLenMap);   // Initialise ans and  // its collatz length  int num = -1, l = 0;   for(int i=1;i<n;i++){     // If value not already computed,    // pass Dict to Helper function    // and calculate and store value    if(collLenMap.find(i)==collLenMap.end())      collatzLenUtil(i, collLenMap);     int cLen = collLenMap[i];    if(l < cLen){      l = cLen;      num = i;    }   }   // Return ans and  // its collatz length  return {num, l};} int main(){   cout<<"("<<collatzLen(10).first<<", "<<collatzLen(10).second<<")"<<endl; } // This code is contributed by shinjanpatra
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)     # Initialise 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))
<script> function collatzLenUtil(n, collLenMap){         // If value already    // computed, return it    if(collLenMap.has(n))        return collLenMap.get(n)         // Base case    if(n == 1)        collLenMap.set(n, 1)     // Even case    else if(n % 2 == 0){        collLenMap.set(n , 1 + collatzLenUtil(Math.floor(n/2) , collLenMap))    }     // Odd case    else{        collLenMap.set(n , 1 + collatzLenUtil(3 * n + 1, collLenMap))    }         return collLenMap.get(n);} function collatzLen(n){         // Declare empty Map / Dict    // to store collatz lengths    let collLenMap = new Map()         collatzLenUtil(n, collLenMap)     // Initialise ans and    // its collatz length    let num = -1, l = 0         for(let i=1;i<n;i++){                 // If value not already computed,        // pass Dict to Helper function        // and calculate and store value        if(collLenMap.has(i)==false)            collatzLenUtil(i, collLenMap)                 let cLen = collLenMap.get(i)        if(l < cLen){            l = cLen            num = i        }     }         // Return ans and    // its collatz length    return [num, l]} document.write(collatzLen(10)) // This code is contributed by shinjanpatra </script>
(9, 20)
 
sweetyty
shinjanpatra
Algorithms
Dynamic Programming
Mathematical
Recursion
Dynamic Programming
Mathematical
Recursion
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Understanding Time Complexity with Simple Examples
Introduction to Algorithms
How to write a Pseudo Code?
0-1 Knapsack Problem | DP-10
Program for Fibonacci numbers
Largest Sum Contiguous Subarray
Longest Common Subsequence | DP-4
Bellman–Ford Algorithm | DP-23