コード例 #1
0
        private int GetCollatzSequenceBruteForce(CollatzChain chain)
        {
            if (chain.CurrentNumber == 1)
            {
                return(chain.Length);
            }

            Solve(chain);

            return(GetCollatzSequenceBruteForce(chain));
        }
コード例 #2
0
 private void GetCollatzSequenceMemoized(CollatzChain chain)
 {
     if (_cache.ContainsKey(chain.CurrentNumber))
     {
         chain.Length += _cache[chain.CurrentNumber];
     }
     else if (chain.CurrentNumber != 1)
     {
         Solve(chain);
         GetCollatzSequenceMemoized(chain);
     }
 }
コード例 #3
0
    private static long Calculate(int limit, List <int> chainLengths, Func <CollatzChain, int> calc)
    {
        var watch = System.Diagnostics.Stopwatch.StartNew();

        for (int ii = 1; ii <= limit; ii++)
        {
            var chain = new CollatzChain(ii);
            chainLengths.Add(calc(chain));
        }
        watch.Stop();
        var memoizedPerformance = watch.ElapsedMilliseconds;

        return(memoizedPerformance);
    }
コード例 #4
0
        public override int SolveCollatzBruteForce(CollatzChain chain)
        {
            while (true)
            {
                if (chain.CurrentNumber != 1)
                {
                    Solve(chain);
                }
                else
                {
                    break;
                }
            }

            return(chain.Length);
        }
コード例 #5
0
        // Here is an example of solving the problem while using memoization. In every loop
        // we first check if the local cache has the collatz chain length stored for the
        // current number. If it does, we use the precomputed value for our calculation
        // instead of recalculating it all over again. If the chain length isn't stored,
        // we simply continue on with the algorithm as normal.
        public override int SolveCollatzMemoized(CollatzChain chain)
        {
            while (true)
            {
                if (_cache.ContainsKey(chain.CurrentNumber))
                {
                    chain.Length += _cache[chain.CurrentNumber];
                    break;
                }
                else if (chain.CurrentNumber != 1)
                {
                    Solve(chain);
                }
                else
                {
                    break;
                }
            }

            _cache.Add(chain.NumToCalculate, chain.Length);
            return(chain.Length);
        }
コード例 #6
0
 public override int SolveCollatzMemoized(CollatzChain chain)
 {
     GetCollatzSequenceMemoized(chain);
     _cache.Add(chain.NumToCalculate, chain.Length);
     return(chain.Length);
 }
コード例 #7
0
 public override int SolveCollatzBruteForce(CollatzChain chain)
 {
     return(GetCollatzSequenceBruteForce(chain));
 }