2012-05-10 3 views
0

의 기본 숫자 b 자릿수를 반환하는 재귀 함수 dec2base(n, b)을 작성해야합니다. 예를 들어.왜 내 재귀 함수가 잘못 되었습니까?

dec2base(120, 10) => [1,2,0] (1 * 10**2 + 2 * 10**1 + 0 * 10**0) 

현재 가지고 있습니다.

def dec2base(n, b): 
    if n < 10: 
     return [n] 
    else: 
     return dec2base(n, b) + [n%b] 

그러나 프로그램을 실행하면 무한 루프 오류가 반환됩니다. 어떤 아이디어?

+0

처럼 약간을 단순화하고 실행 볼 수 있습니다. 당신이 어디로 잘못 가고 있는지 당신이 알 수 있도록 도와 줄 것입니다. – sdolan

답변

0

무한대로 전화 dec2base(n, b). 전화를 걸면

if/else 문의 두 번째 분기가 계속 실행됩니다. 재귀 함수 호출에 감소 된 값을 전달해야하므로 결국 n < 10이 True로 평가됩니다.

+0

나는 n-1을 시도했지만 잘못된 답을 준다. n에 수학적 스타일을 적용해야합니까? – Hoops

+0

Do'n // b'. 또한 if 문은 이해가되지 않습니다. 'dec2base (10,2)'는 [5, 0]을 산출 할 것이고, 이는 틀린 것이다. 네가 원한다면'n

+0

고맙습니다! – Hoops

3

메서드의 어느 지점에서나 n의 값을 감소시키지 않으므로 n> = 10의 값으로 시작하면 루프가 끝나지 않습니다.

또 하나의 관찰 - "n < 10 return [n]"의 논리가 b가 10과 같지 않다면 의미가없는 것처럼 보입니다. 예를 들어, 9 < 10이지만 dec2base의 값을 가정합니다. 9,2)는 아닐 것이다 [9]. 그것은 [1,0,0,1]이 될 것입니다.

2

좋아요, 어떤 재귀 함수에서도 멈추는 어떤 것을 갖기 위해 0으로가는 함수가 있어야합니다. 이 경우, 당신이 원하는 것은 정말 you7 손으로 그것을 할 방법을 모델링하는 것입니다 :

  • 가 digite
  • 가이를 이용한 재발로 나머지를 넣어 기수로
    • 나누기 (기본)

      기반이되지만, 부서의 다른 부분. (몫.) 1000의 16 진수 값을 찾는 경우에, 당신은

      dec2base을한다

    (1000,16) :

    • 경우 첫 번째 매개 변수 == 0, 복귀, 당신은
    • 1000
    • 을 완료 모드 16 (= 8) -> 8
    • dec2base을 저장 (62, 16) -> 재귀 단계

    자, 분명히 recusion 단계를 할 때마다 첫 번째 매개 변수가 더 작아집니다. 생각해 보면 결국 이 0이되어야합니다. 결국 결국 종료됩니다.

    여기 파이썬에서 실제 간단한 버전의 :

    이제
    result = "" 
    
    def dec2base(n,b): 
        global result 
        if n <= 0: return 
        result = str(n % b) + result # why am I prepending it? 
        dec2base(n // b, b) 
    
    if __name__ == '__main__': 
        dec2base(1000,8) 
        print result 
    

    , 기본은 당신이 알파 AF로 15 (10)에서 변환 된 값을 돌봐해야합니다 아무것도> 9 (16 말) 인 경우, 이것은 내가 예의 바른 것처럼 꾸미기를 원했기 때문에 의도적으로 우아하지 않습니다.

  • +2

    글로벌 변수를 수정하여 결과를 전달하는 재귀 함수? * 심각하게 *? – Ben

    +1

    이것이 예와 같이 어떻게 생각되는지 모르겠습니다. 글로벌 변수 스프링은 어디에서 필요합니까? –

    +0

    예, 그것은 내게 전진에 관한 질문을 할 수있는 기회를주기 때문에. 당신은 그것을 좋아하지 않아, 자신의 대답을 써주세요. –

    1

    솔루션에 몇 가지 작은 실수가 있습니다.

    def dec2base(n, b): 
        if n < b:       # so it will work for bases other than 10 
         return [n] 
        else: 
         return dec2base(n//b, b) + [n%b] # you're just missing "//b" here 
    

    당신은 몇 가지 인쇄 문을 추가이

    def dec2base(n, b): 
        if not n: 
         return [] 
        return dec2base(n//b, b) + [n%b] 
    
    관련 문제