2013-08-04 3 views
0

재귀를 이해합니다. 우리는 하나의 메소드에서 시작하여 기본 케이스에 도달 할 때까지 자체를 호출합니다. 이 코드가 어떻게 작동하는지 이해해주십시오. 우리는 스택을 꺼낼 때마다 기본 케이스에 도달하면 끝에 double을 반환한다는 것을 알고 있습니다. 스택은 호출 될 때마다 수정됩니까? 예를 들어 : 3 (Enter) 5 (Enter) *는 분명히 15와 같을 것입니다. 그러나 내가 그것을 볼 때 메소드를 기반으로합니다. if 문이 stack (3,5)이 5를 반환하면 두 번째 호출에서 5를 반환합니다. (3,5)를 보내고 5를 다시 반환합니까? 왜 두 번째가 (3,5) 대신에 스택 (3)으로 보내지 는가?아마도 범위와 관련된 재귀 호출을 설명하십시오.

+ (double)popOperandOffProgramStack:(NSMutableArray *)stack 
    { 
     double result = 0; 

     id topOfStack = [stack lastObject]; 
     if (topOfStack) [stack removeLastObject]; 

     if ([topOfStack isKindOfClass:[NSNumber class]]) 
     { 
      result = [topOfStack doubleValue]; 
     } 
     else if ([topOfStack isKindOfClass:[NSString class]]) 
     { 
      NSString *operation = topOfStack; 
      if ([operation isEqualToString:@"+"]) { 
       result = [self popOperandOffProgramStack:stack] + 
         [self popOperandOffProgramStack:stack]; 
      } else if ([@"*" isEqualToString:operation]) { 
       result = [self popOperandOffProgramStack:stack] * 
         [self popOperandOffProgramStack:stack]; 
      } else if ([operation isEqualToString:@"-"]) { 
       double subtrahend = [self popOperandOffProgramStack:stack]; 
       result = [self popOperandOffProgramStack:stack] - subtrahend; 
      } else if ([operation isEqualToString:@"/"]) { 
       double divisor = [self popOperandOffProgramStack:stack]; 
       if (divisor) result = [self popOperandOffProgramStack:stack]/divisor; 
      } 
     } 

     return result; 
    } 
+0

궁금한 점이 있다면, 3,0을 입력하면 어떻게됩니까? – user523234

답변

0

을 당신은 쓰기 :

은 우리가 객체 오프 스택에게는 기본 케이스가있을 때 우리가 마지막에 더블을 반환하는 호출 될 때마다 떨어져 터지는 알고 스택이 호출 될 때마다 스택이 수정됩니까?

개체가 스택에서 튀어 나와서 스택이 변경되었음을 알 수 있습니다. 그렇다면 왜 스택이 이 아니라고 생각합니까?이 수정 되었습니까?

변수stack의 내용을 참조하는 개체와 혼동하고 있습니까? 변수 stack내용은 변경되지 않습니다. 해당 내용은 개체 (또는 형식 NSMutableArray)에 대한 참조입니다. 그러나 참조 된 개체의 내부 상태가 변경 될 때마다 removeLastObject이 호출됩니다.

거리 주소 (대상에 대한 참조)가 있고 그 안에 일부 사람 (대상의 내부 상태)이있는 집처럼 사람들이 집에 들어서거나 나가는 것처럼 (항목이 밀리거나 튀어 오르는 것처럼) 스택에서) 내부 상태는 계속 변경되지만 집의 주소는 변경되지 않습니다.

HTH.

+0

오, 알 겠어! 우리는 객체가 아닌 객체에 대한 포인터를 전달합니다! 권리? – Kendall

+0

예 - * 포인터 * 또는 * 참조 *. – CRD

0

그것은 문이 가 (3,5)를 전송하고 다시 5를 반환하는 두 번째 통화에 다음 스택 (3,5) 반환 (5)를 전송 다중 경우에 간다?

아니요. 첫 번째 호출 후에 스택이 축소됩니다. 두 번째 호출에서는 오직 (3) 만 보냅니다. 관련 코드 스택 수정 :

if (topOfStack) [stack removeLastObject];