一个 Common Lisp 的尾递归的例子是
复制代码
(defun fib(n)
(fib-iter 1 0 n))
(defun fib-iter(a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
我们可以把我们上述的 Swift 代码也改写成相同形式
复制代码
func fibiter(a: Int, b: Int, count: Int) -> Int {
if count==0 {
return b
}
else {
return fibiter(a + b, a, count-1)
}
}
func fib(n: Int) -> Int {
return fibiter(1, 1, n);
}
我们可以 Playground 里观察是否使用尾递归时的迭代结果变化。
值得注意的是,这里出现了一个 Swift 的问题。虽然 Swift 支持嵌套函数,但是当我们将fibiter 作为一个高阶函数包含在fib函数之内的时候却发生了 EXC_BAD_ACCESS 报错, 并不清楚这是语言限制还是 Bug。
Swift 的高阶函数和闭包
在 Objective-C 时代,使用 block 来实现高阶函数或者闭包已经是非常成熟的技术了。 Swift 相比 Objective-C 的提高在于为函数式编程添加了诸多语法上的方便。
首先是高阶函数的支持,可以在函数内定义函数,下面就是一个很简洁的例子。
复制代码
func greetingGenerator(object:String) -> (greeting:String) -> String {
func sayGreeting(greeting:String) -> String {
return greeting + ", " + object









