2016-03-01 51 views
4

我有一串數字。我需要檢查邊緣上的數字是否是對稱的,這意味着它們在以2爲模時具有相同的餘數。檢查字符串中的數字是否對稱(邊緣)

我已經寫了一個可以工作的代碼,但是我有一些麻煩, 「已經想出這個代碼:

int PaliPair(char* st, int n) 
{ 
    if(n<=1) return 1; 
    return (*st%2 == *(st+n-1)%2) && PaliPair(st +1, n-2); 
} 

現在的問題是,爲什麼我必須返回n-2而不是n-1?我有點困惑,爲什麼它的作品。任何解釋將不勝感激。我想我錯過了一些東西,也許事實上,字符串以"\0"結尾,我需要從中得出結論。

回答

3

如果你有這樣的

"1243" 

例如一個字符串,那麼你在第一次檢查的第一個和最後一個字符。

然後,你需要檢查的字符是

"24" 

中間那麼目標字符串現在有長度爲4 - 2(已經檢查出的字符數)

所以在各遞歸你檢查2個字符,在下一個遞歸你需要檢查2個字符。

至於功能上本身我會寫它像

int PaliPair(const char *s, size_t n) 
{ 
    return n < 2 || *s % 2 == *(s + n - 1) % 2 && PaliPair(s + 1, n - 2); 
} 

甚至像

int PaliPair(const char *s, size_t n) 
{ 
    return n < 2 || (*s - '0') % 2 == (*(s + n - 1) - '0') % 2 && PaliPair(s + 1, n - 2); 
} 
2

假設您的字符串是21312,首先您將比較兩端的2和2。然後你用st+1前進一步,你應該考慮131,所以你不應該考慮2的字符串開頭和結尾,這就是爲什麼你要做n-2

通過這種方式,您可以從字符串的開頭處向前移動一個字符,但也應該從字符串的末尾向後移動一個字符。 我希望你明白我的觀點。

相關問題