2017-11-17 2 views
-1

안녕하세요, 저는 다음과 같이 Collatz 문제와 관련하여 해결해야 할 다음과 같은 문제가 있습니다. 첫 번째 문제는 1 백만 ~ 1 백만 건의 시작 번호를 찾는 응용 프로그램을 개발해야한다는 것입니다. 가장 큰 시퀀스를 생성합니다.linq를 사용하는 Collatz 시퀀스 #

LINQ를 적용하지 않고 다음 코드를 작성했으며이 상황에서 linq를 사용하는 방법을 알고 싶습니다.

var sequence_size = 0; 
     var best_number = 0; 
     var sequence = 0; 


     for (var i = 0; i <= 1000000; i ++) 
     { 
      var size_ = 1; 
      sequence = i; 

      while (sequence! = 1) 
      { 

       sequence = sequence% 2 == 0? sequence/2: sequence * 3 + 1; 
       size ++; 
      } 

      if (size> size) 
      { 
       size_sequence = size; 
       best_number = i; 
      } 
     } 
+1

지금까지 해보신 것은 무엇입니까? '집계 '를보십시오. –

+5

'if (size> size)'? 그게 효과가 없을거야. – juharr

+0

왜? 아무런 이점도 없으며 논리를 난독 화하고 다른 종류의 아동 쇼처럼 보이게 만듭니다. (그리고 심지어는 다른 사람들에게 당신을 위해 그것을하도록 요구하고 있습니다.) – Rob

답변

0

이 내가 권하고 싶습니다 무엇 :이처럼 사용할 수 있습니다

public class MaxSequenceFinder 
{ 
    public int FindBestCollatzSequence(int start, int count) 
    { 
     return Enumerable.Range(start, count) 
      .Select(n => new { Number = n, SequenceLength = CalcCollatzSequence((long)n) }) 
      .Aggregate((i, j) => i.SequenceLength > j.SequenceLength ? i : j) 
      .Number; 
    } 

    private int CalcCollatzSequence(long n) 
    { 
     int sequenceLength = 0; 

     do 
     { 
      n = CalcNextTerm(n); 
      sequenceLength++; 
     } 
     while (n != 1); 

     return sequenceLength; 
    } 

    private long CalcNextTerm(long previousTerm) 
    { 
     return previousTerm % 2 == 0 ? previousTerm/2 : previousTerm * 3 + 1; 
    } 
} 

:

var finder = new MaxSequenceFinder(); 
int result = finder.FindBestCollatzSequence(1, 100); 
Console.WriteLine(result); 

1 000 000의 카운트를 실행 시간이 좀 걸릴 것입니다. 그러나이 경우 (< 100)는 가장 긴 순서는 다음과 같습니다 반환하는 함수를 작성

public static class Ext { 
    public static T MaxBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> key, Comparer<TKey> keyComparer = null) { 
     keyComparer = keyComparer ?? Comparer<TKey>.Default; 
     return src.Aggregate((a,b) => keyComparer.Compare(key(a), key(b)) > 0 ? a : b); 
    } 
} 

:

97 
+0

Wikipedia에서 가장 긴 연속열은 837,799 건의 524 단 계이어야한다고 말합니다. 113383을 계산할 때'int32'를 초과합니다. – NetMage

+0

@NetMage, true입니다. Int64로 충분하다고 생각하십니까? –

+0

예, 'n'이면 충분합니다. 답은 원래의 문제를 해결하지 못한다는 점에 유의하십시오. 가장 긴 시퀀스를 생성하는 'n'을 말하지는 않습니다. – NetMage

0

은 각 요소에 함수를 사용하여 시퀀스의 최대 값을 찾기 위해 확장 기능 만들기 숫자의 Collatz 길이 :

012 :

public long Collatz(long seq) { 
    long len = 0; 

    while (seq != 1) { 
     if (seq % 2 == 0) { 
      seq /= 2; 
      ++len; 
     } 
     else { 
      seq = (3 * seq + 1)/2; 
      len += 2; 
     } 
    } 
    return len; 
} 

그런 다음 당신은 범위의 컴퓨터에 대한 답변을 다음과 LINQ를 사용할 수 있습니다

var maxn = Enumerable.Range(2, 1000000-2).Select(n => new { n, Collatz = Collatz(n) }).MaxBy(nc => nc.Collatz).n;