|
前面談到了遞歸的一些思想,還有概念上的一些理解,這里試著用遞歸解決一些問題。比如回文。
回文是一種字符串,它正著讀和反著讀都是一樣的。比如level,eye都是回文。用迭代的方法可以很快地判斷一個字符串是否為回文。用遞歸的方法如何來實現(xiàn)呢?
首先我們要考慮使用遞歸的兩個條件:
- 第一:這個問題是否可以分解為形式相同但規(guī)模更小的問題?
- 第二:如果存在這樣一種分解,那么這種分解是否存在一種簡單情境?
先來看第一點,是否存在一種符合條件的分解。容易發(fā)現(xiàn),如果一個字符串是回文,那么在它的內(nèi)部一定存在著更小的回文。 比如level里面的eve也是回文。 而且,我們注意到,一個回文的第一個字符和最后一個字符一定是相同的。
所以我們很自然的有這樣的方法:
先判斷給定字符串的首尾字符是否相等,若相等,則判斷去掉首尾字符后的字符串是否為回文,若不相等,則該字符串不是回文。
注意,我們已經(jīng)成功地把問題的規(guī)??s小了,去掉首尾字符的字符串當然比原字符串小。
接著再來看第二點, 這種分解是否存在一種簡單情境呢?簡單情境在使用遞歸的時候是必須的,否則你的遞歸程序可能會進入無止境的調(diào)用。
對于回文問題,我們?nèi)菀装l(fā)現(xiàn),一個只有一個字符的字符串一定是回文,所以,只有一個字符是一個簡單情境,但它不是唯一的簡單情境,因為空字符串也是回文。這樣,我們就得到了回文問題的兩個簡單情境:字符數(shù)為1和字符數(shù)為0。
好了,兩個條件都滿足了,基于以上分析,我們可以很容易的編寫出解決回文問題的遞歸實現(xiàn)方式:
09 | printf("請輸入需要判斷回文的字符串:"); |
13 | rs = is_palindereme(str, n); |
17 | int is_palindereme(char *str, int n) |
19 | printf("Length: %d \n",n); |
20 | printf("%c ----- %c\n", str[0], str[n-1]); |
24 | //printf("%d, %d\n", str[0], str[n-1]); |
25 | return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0); |
程序運行結(jié)果為:
|