Objective c 目标C递归问题?

Objective c 目标C递归问题?,objective-c,ios,recursion,binary-search-tree,Objective C,Ios,Recursion,Binary Search Tree,我正在对自定义编码的BST进行顺序树遍历。下面是代码 -(void) inOrderTraversalToString : (NSString*) accumulateString : (Node*) ptrNode { if(ptrNode == nil) { return; } else { [inOrderTraversalToString : accumulateString : ptrNode.left]; accumul

我正在对自定义编码的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];
    }
}
当我试图编译这个时,会收到各种可怕的错误消息。我知道这可能只是某个地方的打字错误,但一些同行评议会很好。这件事我已经忙了好几天了

谢谢。
--Alex

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

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
尝试以下方法:

- (void) inOrderTraversalToString:(NSString*) accumulateString node:(Node*) ptrNode
[self inOrderTraversalToString : accumulateString : ptrNode.left];
然后是你调用方法的方式;通常,语法如下所示:

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];

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

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

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
尝试以下方法:

- (void) inOrderTraversalToString:(NSString*) accumulateString node:(Node*) ptrNode
[self inOrderTraversalToString : accumulateString : ptrNode.left];
然后是你调用方法的方式;通常,语法如下所示:

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];

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

您的代码与法定的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];
}

此代码假定
left
right
datum
确实是
节点
类的属性,并且
累计字符串
在调用此方法之前已初始化为合理的值。

您的代码远离法律目标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];
}

此代码假定
left
right
datum
确实是
节点
类的属性,并且
累计字符串
在调用此方法之前已初始化为合理的值。

调用方法时需要使用
self
。例如:

- (void) inOrderTraversalToString:(NSString*) accumulateString node:(Node*) ptrNode
[self inOrderTraversalToString : accumulateString : ptrNode.left];

调用方法时需要使用
self
。例如:

- (void) inOrderTraversalToString:(NSString*) accumulateString node:(Node*) ptrNode
[self inOrderTraversalToString : accumulateString : ptrNode.left];

代码中的语法在几个地方出现错误。若要使用多个参数,您需要扩展函数名,以便为每个参数提供参数说明。您可能希望将其更改为以下内容:

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
-(void)inOrderTraversalToString:(NSString*)累加器从节点开始:(节点*)ptrNode

在函数体中,函数调用不正确。函数调用应如下所示:

[对象/类参数描述:(参数1类型)参数1参数描述:(参数2类型)参数2…]

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

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
[YourObjectOrClass inOrderTraversalToString:AccumerateString FromNode:ptrNode.left]

你可能想温习一下目标C的基本知识


代码中的语法在几个地方出现错误。要使用多个参数,您需要扩展函数名,以便为每个参数提供参数说明。您可能需要将其更改为以下内容:

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
-(void)inOrderTraversalToString:(NSString*)累加器从节点开始:(节点*)ptrNode

在函数体中,函数调用不正确。函数调用应如下所示:

[对象/类参数描述:(参数1类型)参数1参数描述:(参数2类型)参数2…]

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

param_description:(param_type) parameter param2_description:(param2_type) parameter2
[object method];
[object method2:arg1 argname2:arg2];
[YourObjectOrClass inOrderTraversalToString:AccumerateString FromNode:ptrNode.left]

你可能想温习一下目标C的基本知识


说重载不受支持可能更好。它只是不是语言的一项功能。这是一个细微的区别,但“不允许”听起来像是被禁止或明确排除的东西,但我相信更准确的说法是,它根本不受支持。这很公平。你可以说它是如此被禁止,以至于他们甚至没有即时消息请在语言中添加:)最好说不支持重载。这不是语言的一个特点。这只是一个细微的区别,但“不允许”听起来像是被禁止或明确排除的东西,但我相信更准确的说法是,它根本不受支持。这很公平。你可以说它是如此的被禁止,以至于他们甚至没有在语言中实现它:)