汉诺塔的计算实现是算法课程中递归部分的经典案例。算法不难,但是要实现,还是要动点脑筋的。大致描述如下: 就是要把n个盘移动到目标柱,首先得把n-1个盘移动到临时柱。 然后把把剩下的最大的盘移动到目标柱。 然后把临时柱作为起始柱,原先的起始柱作为临时柱,重复上述步骤。 如果只移动起始柱的一个盘,就直接放到目标柱即可。 —————&
说十分钟可能有哗众取宠的嫌疑,本人写这个博客,花了半天时间,查阅了很多资料才完成,因此要弄懂协变逆变的本质,可能要多花点时间。很多文章中对于协变的描述大致如下:协变是一个细节化程度高的类型赋值给细节化程度低的类型类型。例如一个方法M,返回值是Giraffe(长颈鹿),你可以把M的返回值赋值给Animal(动物)类型,因为Animal类型是细节化程度底的类型,和Giraffe类兼容。那么方法是协变的
惰性求值 惰性求值也叫按需调用,是一个演算策略,延迟一个表达式的演算,直到需要用到演算值的时候再演算,同时也避免了重复演算。 惰性求值的好处包括: 避免不必要的计算,提升性能。 可以构造以构造一个无限的数据结构 可以定义控制流的抽象类。 惰性求值由于仅仅在需要的时候才求值,所以它可以缩小内存的访问范围。但是惰性求值处理异常,输入输出的时候却有
异常处理 F#中定义异常和定义联合类型中的constructor相似,处理异常的语法和模式匹配的语法也很相似。使用exception关键字定义异常,后面跟异常的名字。接下来是可选的关键字of。 exception WrongSecond of int 通过raise关键字抛出异常,如下面的例子。F#除了raise关键字,还有failwith函数,如
活动模式 活动模式可以使你执行一个函数,来看是否发生了匹配。这也是为什么叫活动的原因。活动模式的设计目标是允许你在程序中更好的复用模式匹配逻辑。活动模式接受一个输入参数,使用该参数执行一些计算,决定是否该匹配发生过。有2种活动模式,完全活动模式和分部活动匹配。 完全活动模式 定义活动模式的语法和定义函数相似。主要的不同点在于活动模式的标识符有个括号和竖线,(| |)。活动
定义类型 F#自定义类型有2种。 元组或者记录,即组合多个不同的类型。类似C的结构或者C#中的类。 联合类型。 元组和记录类型(Tuple and Record Types) 元组就是用逗号,把几个值放在一起。可以把元组赋值给一个标识符,也可以反过来。如果需要忽略元组中的一个值,可以用'_'告诉编译器,忽略该值,如下面的代码。 let&n
类型和类型推断 F#是强类型语言,意味着你不能用整型参数传给只接受string类型参数函数中。你必须显式的转换。F#的类型系统和常规的编程语言不同。F#中,所有的值都有类型,包括哪些是函数的值。 通常,不需要显式的声明类型,编译器根据值能推断出类型。如果一切OK,编译器会保持这样的类型推断。如果类型类型有错误,编译器会报错。VS开发中,可以把鼠标指针悬浮在标识符上查看类
Lists F#中List类型类似集合类型。list可以是空的list,用方括号[]表示。F#中可以连结值,使用量过冒号::把值串联一个list中。 let emptyList = [] let oneItem = "one " :: [] let twoItem = "one " :: "two " :: [] 最后一
递归 运算符 Function Application 模式匹配 控制流 递归 F#中使用递归函数,需要用到rec关键字,表示(Recursion)。看个例子就明白了,计算斐波那契数。 let rec fib x = match x with
F#标识符 常量(Literal) 值和函数 标识符的作用域 使用use F#标识符 F#标识符就是给值命名。使用let关键字和一个等号,再跟一个表达式。表达式是任何代码,可以返回一个值。入下面的给标识符赋值。 let x = 42 很程序员,一眼看到这个代码就觉得这个是变量赋值嘛,这虽相似,但是却不同。在纯粹的函数式编程中,一旦值赋给标识符,就不再改变。这就是为什么称作标示符
Attribute特性,可以往程序集中写入一些元数据。微软类库中自带很多 Attribute类,某些时候,需要对类标注一下 Attribute。那么自定义 Attribute的用处是什么的,或者说,什么时候我们需要自定义 Attribute。 在我看来, 自定义Attribute没啥用。常规的项目开发中,我都可以用变通的方式去实现。当然硬是要为了用而用也可
计算机科学中,union指的是一个包含多种类型或者格式的值,或者数据结构包含这样的值。一些程序语言支持特殊的数据类型——union类型。换句话说,union类型的定义,规定了哪些类型存储在一起。比如,浮点或者长整型。相对于record类型,record类型定义为包含一个float和一个整型。而union则在一个时刻只能体现一种值。 此处提及的untion类型主要指unta
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号