小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

漫談遞歸:字符串回文現(xiàn)象的遞歸判斷

 herowuking 2015-10-10

前面談到了遞歸的一些思想,還有概念上的一些理解,這里試著用遞歸解決一些問題。比如回文。

回文是一種字符串,它正著讀和反著讀都是一樣的。比如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)方式:

01#include "stdio.h"
02#include "string.h"
03 
04int main(void)
05{
06    int n, rs;
07    char str[50];
08 
09    printf("請輸入需要判斷回文的字符串:");
10    scanf("%s",&str);
11 
12    n = (int)strlen(str);
13    rs = is_palindereme(str, n);
14    printf("%d ", rs);
15}
16 
17int is_palindereme(char *str, int n)
18{
19    printf("Length: %d \n",n);
20    printf("%c ----- %c\n", str[0], str[n-1]);
21    if(n == 0 || n == 1)
22        return 1;
23    else{
24        //printf("%d, %d\n", str[0], str[n-1]);
25        return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0);
26    }
27}

程序運行結(jié)果為:

1請輸入需要判斷回文的字符串:level
2Length: 5
3l ----- l
4Length: 3
5e ----- e
6Length: 1
7v ----- v
81

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多