Re: [讨论] 递回要如何锻炼

楼主: ljred (小麻雀吱吱喳喳!)   2016-08-21 20:48:00
想学递回?找个 pure functional programming language 就解决了,
语言本身不给循环,只能用递回XD
递回其实并没有那么难,只要了解递回的思考模式,任何人都可以写出来
1. 首先思考边际情况,也就是可能出现错误的情况,或是可以直接回答出答案,
不需要使用递回的例子。
2.想一个比边际情况还要难一点点的例子,
然后想办法将问题用递回拆解出边际情况的组合。
3.顺利的话,再来将一般的情况用递回拆解(有时2.跟3.是一气呵成的)
会觉得递回很难的应该是因为把思考的顺序弄反,(3. => 2. => 1.)
以费氏数列为例,假设 fib(1) = 1, fib(2) = 1, fib(3) = 2, ...
千万不要一开始就从 fib(100) 开始思考
而是先从 fib(n) n 什么时候会有错误开始?
先确认 n 为正整数或零,如果不是就丢例外,
确定错误情况被排除之后,
再来思考可以直接回答的情况(或者是递回无法使用的情况)
根据定义有两个 fib(0) = 0 跟 fib(1) = 1
再来思考需要使用递回的例子
fib(2) = fib(1) + fib(0)
fib(3) = fib(2) + fib(1)
...
最后推到一般的情况
fib(n) = fib(n-1) + fib(n-2)
然后把整个拼凑起来
大概是这样子,只要是递回的算法都会有这样子的 pattern
比方说 merge sort 跟 quick sort 也是
不要一开始就考虑所有的情况,而是先从特例开始
(此外 bug 一般都是发生在特例情况,从特例开始有助于避免程式错误的好处)
也就是元素只有 0,1,2 ...开始
然后再慢慢修正到可以处理所有的情况
思考模式来说和数学上的自然归纳法很类似。
作者: bibo9901 (function(){})()   2016-08-22 00:32:00
通常费式数列是定义, 不是用观察的orz氏
作者: CoNsTaR ((const *))   2016-08-22 01:18:00
递回特例通常都是极端
作者: frouscy (流浪吧。)   2016-08-22 02:09:00
找pure functional language来练正解XD特别是大部份functional langauge有pattern matching用pattern matching可读性常常比用if-else来得高
作者: dnabossking (少狂)   2016-08-22 12:57:00
是说,各位的离散数学都没教 Recurrence Relations?

Links booklink

Contact Us: admin [ a t ] ucptt.com