【问题标题】:Objective C recursion issue?Objective C递归问题?
【发布时间】:2012-03-07 12:03:05
【问题描述】:

我正在按顺序遍历自定义编码的 BST。这是代码

-(void) inOrderTraversalToString : (NSString*) accumulateString : (Node*) ptrNode {
    if(ptrNode == nil) {
        return;
    } else {
        [inOrderTraversalToString : accumulateString : ptrNode.left];
        accumulateString += [[NSNumber : ptrNode.datum] stringValue];
        [inOrderTraversalToString : (NSString*) accumulateString, ptrNode.right];
    }
}

我在尝试编译时收到各种可怕的错误消息。我知道这可能只是某个地方的错字,但一些同行评审会很好。我已经为此烦恼了

谢谢。 -- 亚历克斯

【问题讨论】:

    标签: objective-c ios recursion binary-search-tree


    【解决方案1】:

    您的代码与合法的 Objective-C 相差甚远。没有为 NSString 定义 + 运算符(并且不允许重载)。 NSString 无论如何都不会与您的递归一起使用,因为它是不可变的。你必须使用 NSMutableString。您也没有正确调用或声明方法。

    这是一个正确版本的尝试:

    - (void)inOrderTraversalToString:(NSMutableString *)accumulateString withNode:(Node *)node
    {
      if(ptrNode == nil) return;
    
      [self inOrderTraversalToString:accumulatedString withNode:ptrNode.left];
      [accumulatedString appendString:[ptrNode.datum stringValue]];
      [self inOrderTraversalToString:accumulatedString withNode:ptrNode.right];
    }
    

    此代码假定 leftrightdatum 确实是您的 Node 类的属性,并且在调用此方法之前 accumulatedString 已被初始化为合理的值。

    【讨论】:

    • 最好说不支持重载。这不是该语言的特性。
    • 这是一个微小的区别,但“不允许”听起来像是被禁止或明确排除的东西,但我认为更准确地说是根本不支持。
    • 很公平。你可以说这是被禁止的,他们甚至没有用这种语言实现它:)
    【解决方案2】:

    您的代码中的语法在多个地方看起来有问题。要使用多个参数,您需要扩展函数名称,以便为每个参数提供参数描述。你可能想把它改成这样:

    -(void) inOrderTraversalToString:(NSString*)accumulateString FromNode:(Node*)ptrNode

    在函数体中,您错误地进行了函数调用。函数调用应如下所示:

    [对象/类 param_desc:(Param1Type)param1 param_desc:(Param2Type)param2 ...];

    如果要调用静态类方法,请先使用类名调用,否则使用正在操作的对象名。因此,在您的代码中,第一个递归调用可能如下所示:

    [YourObjectOrClass inOrderTraversalToString:accumulateString FromNode:ptrNode.left];

    您可能想复习一下 Objective C 的基础知识。查看

    【讨论】:

      【解决方案3】:

      您的方法签名似乎错误,应该是这样的:

      param_description:(param_type) parameter param2_description:(param2_type) parameter2
      

      尝试类似:

      - (void) inOrderTraversalToString:(NSString*) accumulateString node:(Node*) ptrNode
      

      然后就是调用方法的方式;一般来说,语法如下所示:

      [object method];
      [object method2:arg1 argname2:arg2];
      

      我建议您阅读一些关于 Objective-C 的基本介绍,因为您正在努力学习基础知识。

      【讨论】:

        【解决方案4】:

        调用方法时需要使用self。所以像:

        [self inOrderTraversalToString : accumulateString : ptrNode.left];
        

        【讨论】:

          猜你喜欢
          • 2011-07-14
          • 1970-01-01
          • 2020-05-30
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          • 2012-06-25
          相关资源
          最近更新 更多