3.3.4.1 用 C# 求列表中数字的和
只要使用 C# 命令式编程,并处理过标准的 .NET 数组或来自 System.Collections.Generic 的 List<T> 类,[ 写这个程序并不难, ]可能会创建一个变量total,并初始化为零,写一个 for 循环,迭代所有的数字,把每个元素加到 total 上(类似于 total + = list[i]);(或者,可以用 foreach 循环,这只是一个语法糖,能使写程序更方便,但概念仍是相同的。)
但是,使用函数式列表,不允许通过索引访问元素,也不支持 foreach,那么又该如何做呢4?为此,我们可以使用递归,写一个方法,处理列表的两种情况:空和 cons cell。可以在清单 3.15 中看到 C# 版本的 SumList 代码。
清单 3.15 对列表中元素求和 (C#)
int SumList(FuncList<int> numbers) {
return numbers.IsEmpty ? 0 : [1]
numbers.Head + SumList(numbers.Tail); [2]
}
var list = FuncList.Cons(1,FuncList.Cons(2, | 用 1、2、3、4、5
FuncList.Cons(3, FuncList.Cons(4, | 创建列表
FuncList.Cons(5, FuncList.Empty<int>()))))); |
int sum = SumList(list); | 求和
Console.WriteLine(sum); | 输出 15
SumList 方法首先检查列表是否为空。如果不为空,执行匹配的 cons cell分支[2],以递归方式调用 SumList 计算列表尾中元素的和,并将此结果加到保存在头中的值。这个递归调用执行,直至到达列表的结束,发现列表尾为空列表为止。对于空列表[1],函数终止,返回零。
接下来,我们使用非泛型的 FuncList 类中的工具方法 Cons 和 Empty,创建一个列表。创建过程有点冗长,要使之不那么困难,可以实现一个方法,使用通常的 .NET 集合创建函数式列表。