2017-09-06 89 views
0

不久,我需要知道這個功能是如何工作的?裏面有什麼?傳遞的字符串如何反轉?這個遞歸線如何實現打印字符串反轉?

這裏是代碼,並提前致謝。

#include <stdio.h> 
void rev (const char* const); 

int main() 
{ 
    char str [] = "Hey There"; 
    rev(str); 

    return 0; 
} 

void rev(const char* const c) 
{ 
    if(c[0]=='\0') 
     return ; 
    else 
    { 
     rev(&c[1]); 
     putchar(c[0]); 
    } 
} 

編輯:作爲評議人建議,我會解釋我不理解了。字符串不顛倒,但反向打印,好吧。用來做這件事的機制是什麼?什麼是執行順序?

+0

我不認爲你會收到很多答案,如果你沒有努力解釋更多,尤其是你不明白什麼..... –

+3

字符串是不反轉,它只是*印* *在相反。巨大差距。 – unwind

+0

字符串沒有反轉。它被**打印**反向。 – wildplasser

回答

1

的原因是,該代碼指示它處理輸出當前炭前做的字符串的其餘部分。想象一下字符串「on \ 0」

rev("on\0"); 
    ->rev("n\0"); 
    ->rev("\0"); 
     <-return; // hits base case 
    putchar('n'); // resumes after recursive call 
    <-return;  // invisible return at end of function 
    putchar('o'); // resumes after recursive call 
    <-return;  // invisible return at end of function 

這裏的每個標識代表一個嵌套的調用。因此,在基本情況下,您可以同時撥打rev的3個電話,每個號碼都有不同的c

其重要的是知道c獨特每次調用這樣,當以rev返回調用先前revc具有不在被叫改變。這使得它沒有什麼特別的,所以實際上它的工作方式與每次調用不同函數的方法相同。它在上次呼叫返回後繼續。

+0

現在更清楚了,但唯一不能理解的是如何通過字符串來檢測腫瘤?什麼行將指針移動到下一個字符? – Kordy

+0

這是C指針魔術..'&c [1]'這得到'c'的第二個元素的地址。因此,對於\ n「'中的* char」,其中'c'是內存地址0,'&c [1]'將指向內存地址1,代表'「n \ n」'。如果數組是整數'&intArr [1]'是'&intArr + 8'(對於64位整數) – Sylwester

-1

如上所述,它是遞歸函數。所以執行如下

從main(),rec()被調用。控件現在進入rec()函數。在哪裏進行條件檢查以檢測字符串的結尾。直到檢測到字符串結束,否則部分被執行。

現在讓我們看看其他部分發生了什麼。

else再次調用rec()。再次調用rec(),直到滿足字符串的結尾。

因此調用順序就喜歡這個 - >

main()-> rec()->rec(rec(rec(... until \0..) putchar()) putchar())putchar()) 

所以從去年putchar()最後rec()功能控制的結束將被執行。然後在最後一個之前繼續,直到從main()調用的第一個rec()

main() - >rec(H),因爲它不爲空 - >再次呼籲rec(e)

這裏的控制還沒有出來第一個電話到rec()。所以rec(H)看起來

rec(H) 
{ 
rec(e); 
putchar(H); 
} 

它繼續這樣下去

0

其實這個遞歸函數並不顛倒輸入字符串。它只是以相反的順序打印。 的邏輯是簡單 - 假設我有字符串str [4] = 「ABC」 這是空終止字符串中C.

  • 對於第一呼叫到修訂版(STR) - STR [0]是「 A'非空 - >調用rev(str [1])和print str [0] ='A'
  • 第二次調用rev() str [0]是'B',它不是null - > call rev(str [1])和print str [0] ='B'
  • 依此類推,直到找到'\ 0'。

現在從每個函數返回之前調用它打印海峽[0] -

  • 所以對於「\ 0」 - 它只是返回,不打印任何東西。對於'C',它將打印'C'
  • 對於'B',它將打印'B' 依此類推。

所以字符串將以相反的順序打印。

0

根據你的程序,**ħeythere **,在轉功能,

  1. C [0] = H被檢查爲NULL,或者不==> NO
  2. 傳遞地址& c [1] =「ey there」e開始再次轉動功能。
  3. C [0] = E被檢查爲NULL,或者不==> NO
  4. 傳遞地址& C [1] = 「Y有」其開始從ý再次加快轉速的功能。
  5. 該邏輯持續到結束。
  6. C [0] = E被檢查爲NULL,或者不==> NO
  7. 傳遞地址& C [1] = \ 0是NULL字符將被傳遞到修訂版功能。
  8. 一旦識別出\ 0,rev函數開始返回。
  9. rev函數後,我們有putchar(c [0]),其中c [0]的最新值爲'e'[按照第6點]。
  10. 打印繼續ËřËH TýËħ
0

爲了使功能的作用重寫它更清晰下列方式

void rev(const char * const s) 
{ 
    if (s[0] != '\0') 
    { 
     char c = s[0]; 
     rev(s + 1); 
     putchar(c); 
    } 
} 

所以對於存儲功能的字符串在變量c的第一個字符函數的第一個電話。

然後該函數被稱爲第二次將指針移動到第二個字符。該函數再次將該字符存儲在其自己的(本地)變量c中。

依此類推,直到遇到終止零。

然後,在將控件傳遞給調用調用之前,每個函數調用都將打印存儲在變量c中的字符,並獲得字符串字符的相反順序。