2016-12-09 2 views
1

재귀를 사용하여 과제에 대한 3 가지 방법으로 collatz 추측을 보여주는 코드를 작성해야합니다. 아이디어에 익숙하지 않다면, n이 짝수이면 n/2로 나누고 n이 홀수 인 경우 3n + 1을 곱해서 초기 값 n을 취하면 궁극적으로 1의 값을 얻을 수 있다고 추측합니다. 3 가지 방법으로 전방, 후방 및 회문 방식으로 알고리즘을 완성했습니다.Collatz 추측문문

예를 들어, 포워드 방식으로 값 (32)은 표시 할 32 16 8 4 2 1

거꾸로 방식으로 값 32 마지막

1 2 4 8 16 32 표시 할 상기 회문 패션은 보여줄 것입니다 32 16 8 4 2 1 2 4 8 16 32

전방과 후방으로 나갈 수 있었지만 회문 부분이 나를 미끄러 져하고 있습니다. 내 모든 노력은 앞으로의 패션을 보여 주거나 나를 무한 루프에 빠트 렸습니다.

* 중요 * 여기 까다로운 부분이다 : 나는 이야 문제 좀 도와 로컬 또는 글로벌 변수를 선언 할 수 없습니다. Collatz 메서드, 루프 및 재귀의 원래 인수 만 사용할 수 있습니다. 누구든지이 사기꾼을위한 해결책을 가지고 있습니까?

def Collatz(number , algorithm): 
    if number == 1: 
     print number 
     return 
    if algorithm == 'F': 
     if number % 2 == 1: 
      print number 
      Collatz((3*number) + 1, algorithm) 
     if number % 2 == 0: 
      print number 
      Collatz((number/2),algorithm) 
    if algorithm == 'B': 
     if number % 2 == 1: 
      Collatz((3*number) + 1, algorithm) 
      print number 
     if number % 2 == 0: 
      Collatz((number/2),algorithm) 
      print number 
    **if(algorithm == 'P'):** 

m = input("Enter a positive integer value: ") 
displaymode = '' # initialize to anything not F, B, P 
while displaymode not in ['F', 'B', 'P']: 
    displaymode = raw_input("Choose a display mode: F=forward, B=backward, P=palindrome: ") 
Collatz(m, displaymode) 
print 
+0

아마도 사람들이 재귀에 대한 진정한 길을 포용해야합니다. – Iluvatar

+0

솔직히이 경우 로컬 또는 전역 변수를 사용하지 않는 것이 좋습니다. 앞으로 인쇄하려면 숫자를 인쇄 한 다음 나머지는 인쇄하십시오. 거꾸로하려면, 나머지 작업을 한 다음 번호를 인쇄하십시오. palindrome은 단순히 둘 다하고 있습니다. – Kytuzian

+1

나는 그들이 지금 당신을 강요하려고하는 것을 봅니다 ... –

답변

1

그래서 당신은 재귀 단계 전에 print 문을두고, 알아 냈어요으로 전방 경우를 나타낸다. 그리고 재귀 단계 후에 print 문을 넣으면 역순으로 표시됩니다. 이제 앞으로 진행 단계와 그 뒤로 진행 단계를 보여주는 회문문 사례를 어떻게 표시 하시겠습니까?

앞으로 진행할 경우 앞으로 진행할 작업은 계속해서 Collatz입니다. 이 작업을 수행 할 때마다 시퀀스의 다음 번호를 얻고 재귀 수준을 낮 춥니 다. 당신은 추락하기 전에 번호를 인쇄, 따라서이 같은 얻을 : 아래로 깊은 재귀 계층을가는 나타냅니다,

time --> 

number=8 
    | \ 
    | number=4 
    |  | \ 
    |  | number=2 
    |  |  | \ 
    |  |  | number=1 (base case) 
    |  |  |  | 
    8  4  2  1 (what's printed out) 

8 4 2 1 순서이 그림에서

에 인쇄합니다. 각 세로 조각은 그 당시 코드를 실행하고있는 Collatz 함수의 값을 보여줍니다.

일단 기본 케이스에 도달하면 돌아와서 함수 실행을 마칩니다. 당신이 통과 한 각각의 기능은 제어권을 회복하고 계속해서 실행됩니다. 전진의 경우, 아무 일도 없었습니다. 역방향 경우에는, 그러나, 당신은 이런 일이처럼 뭔가 선도, 재귀 후 인쇄 :

number=8         number=8 
     \ (n=8) waiting for Collatz... /| 
     number=4     number=4 | 
       \ (n=4) waiting.../|  | 
       number=2  number=2 |  | 
        \ .../|  |  | 
        number=1 |  |  | 
         |  |  |  |  
         1  2  4  8 (what's printed out) 

1 2 4 8

는 희망이 그것을 만드는 순서대로 인쇄 더 무슨 일이 일어나고 있는지에 대한 명확하고 조금 palindrome 버전을 수행하는 방법에 대해.

+0

그게 내가 불행히도 잃어버린 곳이야. 값이 1에 도달하면, 프로그램은 기본값으로 돌아가서 return 문으로 끝난다 .... – Caladin00

+0

... 그리고 다른 일이 계속 일어나고있다. –

+1

하지만 그렇지 않다. 꽤 끝났어, 당신이 후진 적 경우에서 이점을 취한다는 사실. – Iluvatar