摘要:拿简单的阶乘函数来举例,非递归版本可以简单的写成这样: 这个会被编译为:而将一个普通递归算法改成成尾递归的关键往往是,在参数列表中多加一个状态参数,这样在调用下一次递归的时候,本次调用时的信息就不需要保存了,避免了 StackOverflowException. F# 可以对尾递归自动做编译优化,变成循环来处理(不确定是否对所有尾递归都能做到?):这个版本的代码会被编译为:很明显可以看到代码的结...
阅读全文
摘要: 可区分的联合也可以含有成员 (member). 如下列代码示例给二叉树添加了一个 Size 属性:以上用了模式匹配的语法来计算节点数(忽略了 Tip)。即:二叉树树的节点数 = 1(当前节点)+ l.Size (左子树节点数) + r.Size (右子树节点数)这里显然用了一个递归,我们用 Reflector 看看编译生成的代码:可以发现该代码仍然使用的递归,而没有做任何优化(大概是因...
阅读全文
摘要:代码: 输出:Hi there, I'm Jack and I'm 30 years old. Hi there, I'm Tom and I'm 20 years old. Jack 20 type Person = {Name: string; Age: int;} with member SayHi...
阅读全文