2014-12-04 2 views
3

최근 Google Foobar에서 몇 가지 문제를 재미있게 해결해 왔으며 지금은 4 일 이상 그 중 하나에 갇혀있었습니다. 그것은 다음과 같이 정의 된 재귀 함수에 대한 것이다 :재귀 시퀀스 해결

R(0) = 1 
R(1) = 1 
R(2) = 2 
R(2n) = R(n) + R(n + 1) + n (for n > 1) 
R(2n + 1) = R(n - 1) + R(n) + 1 (for n >= 1) 

도전은 str_S 최대 n되도록 R(n) = S 반환 정수 S의베이스 (10) 문자열 표현되는 함수 answer(str_S) 쓰고있다. 그러한 n이 없으면 "없음"을 반환합니다. 또한 S는 10^25보다 크지 않은 양의 정수가됩니다.

필자는 재귀 함수와 재발 관계를 해결하는 방법에 대해 많은 연구를했지만 운이 없었습니다. 나는 처음 500 개의 숫자를 출력했는데, 나는 각각의 숫자와 아무 관계가 없다는 것을 발견했다. 재귀를 사용하는 다음 코드를 사용 했으므로 숫자가 커지기 시작하면 정말 느려집니다.

def getNumberOfZombits(time): 
    if time == 0 or time == 1: 
     return 1 

    elif time == 2: 
     return 2 

    else: 
     if time % 2 == 0: 
      newTime = time/2 
      return getNumberOfZombits(newTime) + getNumberOfZombits(newTime+1) + newTime 

     else: 
      newTime = time/2 # integer, so rounds down 
      return getNumberOfZombits(newTime-1) + getNumberOfZombits(newTime) + 1 
도전은 또한 그들이 그래서, 여기에 몇 가지 테스트 케이스를 포함

: 나는 간단 아무것도 재발 관계를 해결해야하는 경우

Test cases 
========== 

Inputs: 
    (string) str_S = "7" 
Output: 
    (string) "4" 

Inputs: 
    (string) str_S = "100" 
Output: 
    (string) "None" 

나도 몰라,하지만 하나의 존재로 심지어 홀수 숫자에 대해서도, 나는 그것을하기가 정말로 어렵다고 생각한다. (나는 아직 학교에서 배웠다. 그래서 나는이 주제에 관해서 모든 것이 인터넷 기사에서 나온다).

그래서,이 문제를 마무리하라고 안내 전혀 도움을 환영합니다 :) 대신 수학적으로이 기능을 단순화하기 위해 노력

+1

나는 진보 된 수학과 빠른 매트릭스 지수를 사용해야한다고 생각합니다. –

+1

도움이 될 수도 있습니다 : http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can-i-use-it-in-python –

+0

@LambdaFairy 아마도 이것입니다! 나는 그것이 많은 차이를 만들지는 않을 것이라고 생각했지만 이전보다 훨씬 빨랐습니다. 감사! 나는 그것을 이것을 구현하려고 노력할 것이다. 만약 내가 트릭을했는지 알려 주겠다. D –

답변

1

될 것입니다, 파이썬에서 알고리즘을 단순화. @LambdaFairy에서 제안한 것처럼 getNumberOfZombits (time) 함수에 메모를 구현했습니다. 이러한 최적화로 인해 은 많이이되었습니다.

그런 다음, 그 수만큼의 토끼에 대한 입력이 무엇인지 알아 내려고 다음 단계로 넘어갔습니다. 나는 그 음모를보고 이전에 함수를 분석했고, 짝수는 더 높은 출력을 먼저 가지고 있고 얼마 후에 홀수가 같은 레벨에 도달했다는 것을 알았습니다. 우리가 그 출력을 위해 가장 높은 입력을 원했기 때문에, 먼저 짝수와 그 다음 홀수를 검색해야했습니다.

홀수는 항상 동일한 출력에 도달하는 데 걸리는 시간보다 오래 걸립니다. Plot of the function

문제는 매번 1 씩 증가하는 숫자를 검색 할 수 없다는 것입니다. 너무 느립니다. 내가 해결 한 것은 바이너리 검색과 유사한 알고리즘을 구현하는 것이 었습니다. 첫째, 나는 하나의 답을 찾거나 더 이상 검색 할 숫자가 없을 때까지 알고리즘과 같은 이진 검색을 사용하여 짝수를 검색합니다. 그런 다음 알고리즘과 같은 이진 검색을 사용하여 홀수로 동일한 작업을 수행하고 대답을 찾으면 이전 답변보다 반드시 큰 것으로 바꿨습니다.

은 내가이 문제를 해결하는 데 사용되는 소스 코드를, 그래서 누군가가 그것을 필요로하는 경우 나는 그것을 공유 괜찮다 :이 퍼즐을 해결하는 열쇠는 이진 검색을 사용했다

0

.

시퀀스 생성기에서 볼 수 있듯이 대략적으로 n/2 회귀를 사용하므로 R (N) 계산에 약 2 * log2 (N) 회귀 호출이 필요합니다. 그리고 물론 당신은 홀수와 짝수 모두를 위해 그것을 할 필요가 있습니다.

그다지 나쁘지는 않지만 입력을 제공 할 N을 검색 할 위치를 알아야합니다. 이를 위해 먼저 N에 대한 상한 및 하한 검색을 구현했습니다. 각 시퀀스 (홀수 및 짝수) 각각에 대해 하위 및 상위 경계를 형성하는 N 및 2N을 가질 때까지 2의 제곱으로 N을 걸어갔습니다.

이러한 경계를 사용하여 N 값 또는 그 존재하지 않는 값을 빠르게 찾기 위해 이진 검색을 수행 할 수있었습니다.