2012-02-16 83 views
1

我正在做一個定製編碼BST的樹遍歷。下面的代碼目標C遞歸問題?

-(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]; 
    } 
} 

試圖編譯這個時候我收到各類可怕錯誤消息。我知道這可能只是一個錯誤的地方,但一些同行評審會很好。我一直在攪動這個

謝謝。 - 亞歷

回答

0

代碼中的語法在多處出現錯誤。要使用多個參數,需要擴展函數名稱以爲每個參數提供參數描述。你可能想改變它的東西是這樣的:

- (空)inOrderTraversalToString:(的NSString *)accumulateString FROMNODE:(節點*)ptrNode

函數體中,你正在做功能調用不正確。函數調用應該如下所示:

[object/class param_desc:(Param1Type)param1 param_desc:(Param2Type)param2 ...];

如果您要調用靜態類方法,請首先調用類名稱,否則使用您正在操作的對象名稱。因此,在您的代碼中,第一次遞歸調用可能如下所示:

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

您可能要刷上目標C的基礎退房

0

你的方法的簽名似乎是錯誤的,它應該是這樣的:

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

嘗試類似:

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

再有就是你打電話給你的方法途徑;一般語法如下:

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

我建議你讀了一些基本的介紹客觀-C,因爲你的基礎知識掙扎。

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一直呼籲在此之前初始化一些合理方法。

+0

也許不如說是不支持重載。它只是不是該語言的一個特徵。 – ThomasW 2012-02-16 04:15:52

+0

我真的沒有看到語義上的差異。 – UIAdam 2012-02-16 04:17:15

+0

這是一個微小的區別,但'不允許'聽起來像是被禁止或明確排除的東西,但我相信更準確地說它根本不被支持。 – ThomasW 2012-02-16 04:19:52

0

調用方法時需要使用self。因此類似:

[self inOrderTraversalToString : accumulateString : ptrNode.left];