@
krazy 也是可以的。纯用fp语言的好处就是逼迫你自己不要一下子就去想命令式的实现,而是重点关注算法本身的逻辑。给两个例子,haskell的(手边没环境,例子都不是我自己写的)
fibonacci 数列
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
快排
quicksort :: [Char] -> [Char]
quicksort [] = []
quicksort (x:xs) = quicksort [y | y <- xs, y <= x] ++ [x] ++ quicksort [y | y <- xs, y > x]
=============
你看,基本就是把步骤用haskell描述一下就好了。当然这些用命令式语言也是可以写出来的(无论是用递归还是迭代的方式),用fp的意义就是更清楚的将“实现算法的步骤”和“为了这些步骤而去实现的步骤”区分开。
比如:快排中,“将数列按x分割成两部分,左边小于它,右边大于它”是一个“实现算法的步骤”,而“用两个指示ij去从头开始迭代,如果发现j指向的比x小,那么就交换下i与j指向的元素,等等等等”,这是“为了这些步骤而去实现的步骤”,先专注于“实现算法的步骤”,再去专注怎么去实现,要比一上来就去想实现,要好得多。呵呵,不知道我说明白了没有。
================
还有一点,如果想学习算法,一定要多思考多练,举个例子,关于搜索树:为啥搜索树要建成二叉的?为啥每种搜索树都有一个maintain操作,它们存在的意义是啥?因为这个maintain操作,不同的树分别引入了什么概念(比如红黑树、AVL),它们又是如何运作的,它们为啥是正确且高效的?等等。
希望对你有帮助。