2013-08-22 38 views
1

說我是這樣的:(預測輸出)可視化和不使用計算機解決問題recusrive

void abc (char *s){ 

    if(s[0]=='\0') 
     return; 

    abc(s+1); 
    abc(s+1); 

    printf(「%c 「, s[0]); 
} 

這不是很難解決,但我花太多時間做這件事,我已經到重做這樣的問題2-3次,因爲我失去了遞歸和變量值(特別是當有2-3個這樣的遞歸語句時)的軌跡

有沒有什麼好的方法可以用來解決這些問題?

+0

希望你也能對算法進行口頭描述(理想情況下用圖片和方程)。然後你可以在紙上測試它並證明它給出了正確的解決方案。最後,它仍然要檢查代碼是否正確實現了算法。 –

+0

你有沒有試過在樹上畫出電話? –

回答

1

基本技巧是首先從一個小輸入開始。然後嘗試一個更大。然後嘗試使用比這更大的一個。對於遞歸函數,應該出現一個模式,讓你預測下一個模式會是什麼樣子,前提是你知道前一個樣子的樣子。

因此,讓我們從一個空字符串開始。很簡單,沒有任何打印。

input: "" 
output: 

接下來是一個長度爲1的字符串。幾乎一樣簡單,兩個遞歸調用每個都不做任何事情(空字符串大小寫),然後打印字符串的字符。

input: "z" 
output: z 

接下來是一個長度爲2的字符串。每次遞歸調用都會打印第二個字符(長度爲一個字符串的字符串),然後打印第一個字符。

input: "yz" 
output: zzy 

因此,我們試着預測長度爲3的字符串會發生什麼情況。將會發生的情況是,排除第一個字符的子字符串會被處理兩次,然後打印出第一個字符。該子字符串是長度爲兩個字符串的字符串。所以:

input: "xyz" 
output: zzyzzyx 

所以,現在應該清楚如何給定電流輸出序列獲得下一個輸出序列。

0

拿一堆適當大小的索引卡片。開始追蹤初始調用遞歸函數。當您接到另一個電話時,請啓動一張新的索引卡,並將其放在第一張卡的前面或後面(如適用)。遲早你會(除非你跟蹤一個無限遞歸)跟蹤一個不會進行遞歸調用的調用的執行,在這種情況下,將返回值複製回來你所來自的卡。

這可能是一個好主意,包括'去卡X'和'來自卡Y'卡上。

在複雜的情況下,您可能會發現創建多個卡堆來跟蹤您的函數調用很有用,哦爲什麼這麼幹,爲什麼不叫它們調用堆棧

0

分析遞歸最簡單的例子是Fibonacci and Factorial function

這將幫助您更好地分析遞歸函數。每當你失去遞歸函數的軌跡時,只要回想一下these的例子。

相關問題