/** * Beispiel aus * * - Algorithmen und Datenstrukturen für Dummies * - von Andreas Gogol-Döring und Thomas Letschert * - Verlag Wiley-VCH; Oktober 2019 * - Kapitel 3, Daten und ihre Struktur * * @author A. Gogol-Döring, Th. Letschert */ import Foundation struct AuD_03_05_ListSum { enum IntList { case Nil indirect case Cons (head: Int, tail: IntList) } static func FLst(n: Int) -> IntList { func F(x: Int) -> Int { return (x == 0) ? 1 : x * F(x: x - 1) } var l: IntList = IntList.Nil for i in 0...n { l = IntList.Cons(head: F(x: i), tail: l) } return l } static func ListSum(lst: IntList) -> Int { var s = 0 var lstVar: IntList = lst whileLoop: while (true) { switch lstVar { case .Cons(let v, let rest) : s = s + v lstVar = rest case .Nil : break whileLoop } } return s } static func ListSumR(lst: IntList) -> Int { switch lst { case .Nil : return 0 case .Cons(let v, let rest) : return v + ListSumR(lst: rest) } } static func run() { let l = IntList.Cons(head: 1, tail: .Cons(head: 2, tail: .Cons(head: 3, tail: .Cons(head: 4, tail: .Cons(head: 5, tail: .Nil))))) print(ListSum(lst: l)) print(ListSumR(lst: l)) } }