由一個C語言遞迴判斷迴文數的程式產生的回憶

來源:互聯網
上載者:User

  今天,看一位學長的部落格《遞迴的力量》,受到的啟發還是很多的,以前寫遞迴程式,從來都沒有好好想過,這裡為什麼要用到遞迴,以及什麼樣的情況要用到遞迴。引用他博文中的一句話,也是思考的一個方式:可以用遞迴實現的情境要滿足兩個條件:

      第一:這個問題是否可以分解為形式相同但規模更小的問題?
      第二:如果存在這樣一種分解,那麼這種分解是否存在一種簡單情境?

      有一個例子是用遞迴判斷一個迴文序列,迴文大家都知道就是類似abba 或者abcba這樣的序列,判斷迴文的基本思想也就是首尾字元是相同的,由於他的對稱性,那麼可以得知,這各串是可分解的。那麼有沒有一種簡單可終止的情況,那就是剩下最後一個字元或者沒有字元的情況了,接下來就可以按照遞迴的思路寫這個程式了。

      然後,我自己就寫了一下按照遞迴實現判斷一個字串是否是一個迴文序列的C程式,寫的過程中發現了以前曾今專門研究的問題,自己在這上面犯錯誤也真的是非常的慚愧。。。

   

 1 #include<stdio.h>
2 #include<stdlib.h>
3
4 /*程式接受兩個參數 param1 字串 param2 字串長度*/
5 int is_palindrome(char* para_str , int len);
6
7 int main(int argc , char* argv[])
8 {
9 int n = atol(argv[2]); /*C標準庫函數,轉換字串為long int*/
10 if(is_palindrome(argv[1],n))
11 printf("this string is palindrome !\n");
12 return 0;
13 }
14
15 int is_palindrome(char* para_str , int len)
16 {
17 printf("Length: %d \n",len);
18 printf("%c ----- %c\n",para_str[0],para_str[len-1]);
19 if(len == 0 || len == 1)
20 return 1;
21 else
22 return((para_str[0] == para_str[len-1]) ? is_palindrome(++para_str,len-2) : 0);
23 /*這裡更正了學長的一個小錯誤,參數應該是len-2*/
24 }
 看學長的代碼時發現了一個錯誤就是,參數的問題,應該是len-2,事實上每次是剪掉首尾的,然而當程式第一次執行的時候,結果是這個樣子的

也就是說第一次遞迴後,字元指標並沒有向後移動,於是乎。。。

我仔細的看這句代碼,一遍一遍又一遍。。

return((para_str[0] == para_str[len-1]) ? is_palindrome(para_str++,len-2) : 0);

     終於發現了那個問題就是++操作符,以前在《C和指標》上曾經理解過 i++ 和 ++i的區別,++是右結合的操作符,i++的執行過程是先獲得i的一份拷貝,然後執行+1操作。注意這個拷貝地址是未知的,所以千萬不要把i++或者++i來當做左值L-Value來使用。這種賦值當然是不合法的。

     但是這還沒完,其實這個是個編程習慣的問題,習慣了*str++這樣的移動指標操作,在這裡也慣性的這麼寫了,其實最好的風格應該是

return((para_str[0] == para_str[len-1]) ? is_palindrome(para_str+1,len-2) : 0);
 因為這裡實際上傳遞的是一個參數。以前網上有朋友說+1和++的區別,當然最大的區別就是前者不改變自身,更像一個“值”。。。。
 這個問題並不是什麼非常值得研究的東西,很小很小,但卻是自己一直在犯的各種小錯誤,與各位共勉~
 附上執行成功後的



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.