2015-09-26 66 views
3

我正在學習Swift 2(和C,但也不是很久),並且我花了很長時間來處理遞歸枚舉。Swift中的遞歸枚舉

看來我需要把indirect放在enum之前,如果是遞歸的話。然後,我有第一個案例,其中括號之間有Int,因爲後來在交換機中它返回Integer,是嗎?

現在第一個問題與第二種情況Addition。在那裏我必須在括號之間插入ArithmeticExpression。我試着把Int放在那裏,但它給了我一個錯誤,必須是ArithmeticExpression而不是Int。我的問題是爲什麼?我無法想象任何事情是什麼。爲什麼我不能在那裏放兩個Int

下一個問題是關於ArithmeticExpression。在funcsolution它進入一個值爲ArithmeticExpression類型的表達式,是否正確?其餘的,至少現在是完全清楚的。如果任何人都可以用簡單的方式向我解釋,那會很棒。

下面是完整的代碼:

indirect enum ArithmeticExpression { 
    case Number(Int) 
    case Addition(ArithmeticExpression, ArithmeticExpression) 
} 

func solution(expression: ArithmeticExpression) -> Int { 
    switch expression { 
    case .Number(let value1): 
     return value1; 
    case . Addition(let value1, let value2): 
     return solution(value1)+solution(value2); 
    } 
} 

var ten = ArithmeticExpression.Number(10); 
var twenty = ArithmeticExpression.Number(20); 
var sum = ArithmeticExpression.Addition(ten, twenty); 
var endSolution = solution(sum); 
print(endSolution); 

回答

1

的原因Addition情況下需要兩個ArithmeticExpression S的而不是兩個Int s是使之能夠處理這種遞歸情況:

ArithmeticExpression.Addition(ArithmeticExpression.Addition(ArithmeticExpression.Number(1), ArithmeticExpression.Number(2)), ArithmeticExpression.Number(3)) 

或,在多於一行上:

let addition1 = ArithmeticExpression.Addition(ArithmeticExpression.Number(1), ArithmeticExpression.Number(2)) 
let addition2 = ArithmeticExpression.Addition(addition1, ArithmeticExpression.Number(3)) 

它代表:

(1 + 2) + 3 

遞歸定義允許您添加不僅數字,而且其他算術表達式。這就是enum的力量所在:它可以表達多個嵌套的加法運算。