[mac 10.7.1 lion intel-based x64 gcc4.2.1]
q: 遞迴的本質是什麼?
q: 舉些例子說明遞迴的無處不在吧。
a: 比如需要計算乙個陣列中最大的數值。
int find_max(int arr, int size)
如果從遞迴的角度,求乙個陣列中最大的值被分解為求第乙個數和剩下乙個陣列中最大值比較得到的最大值。
所以**如下:
#include #define print_d(intvalue) printf(#intvalue" is %d\n", (intvalue));
#define max(a, b) ((a) > (b) ? (a) : (b))
int find_max(int arr, int size)
int main()
; int max_ret = find_max(arr, sizeof(arr) / sizeof(arr[0]));
print_d(max_ret)
return 0;
}
執行結果:
同理,求陣列中最小值,求字串的長度,陣列中所有元素的和等等也類似。
q: 字串反轉可以使用遞迴麼?
a: 是的。如果需要將乙個字串反轉,可以這麼思考:它將首先將第乙個和最後乙個字元反轉,接著將中間的字串反轉,**如下:
#include #define print_str(str) printf(#str" is %s\n", (str));
#define swap(type, a, b)
void reverse_str(char *str, int len)
int main()
執行結果:
q: 將乙個整形數的字串形式輸出,如何用遞迴?
a: 可以將此整數模10,得到的資料最後輸出;繼續遞迴整數除以10剩下的數值。
#include void print_int(int n)
int main()
執行結果:
同理,逆序輸出,判斷是否是回文也是類似的。
q: 輸出乙個整形對應二進位制形式中含有位1的個數,如何用遞迴?
a: 它的值可以看成:如果整數n是奇數,那麼返回 n / 2二進位制含有位1個數 + 1的和;如果是偶數,直接返回 n / 2二進位制含有位1的個數;
**如下:
#include #define print_d(intvalue) printf(#intvalue" is %d\n", (intvalue));
int int_has_1_count(int n)
int main()
執行結果:
1099的二進位制形式是: 10001001011, 可以確定含有二進位制位1的個數為5.
同理,二分查詢,二叉樹遍歷等都類似。
q: 求乙個數加上另乙個數m的值,如何用遞迴?
a: 將此過程分解為m次自增操作。如下示例:
#include #define print_d(intvalue) printf(#intvalue" is %d\n", (intvalue));
int add_x(int *n, int add_num)
}int main()
執行結果:
類似,兩個變數之間的操作都可以轉換成更小的操作,看怎麼使用更小的操作來實現大操作。
q: 3個不同元素abc,輸出排列方式組成的所有形式。比如, abc, acb, bca等等。
a: 將輸出的大過程看成需要輸出此3個元素,小過程為輸出乙個元素,且只能輸出一次。**如下:
#include #define print_d(intvalue) printf(#intvalue" is %d\n", (intvalue));
// a, b, c : the output char;
// print_count_a, print_count_b, print_count_c : can print count
// output: the output array
// output_index: current print index
void print_abc_all_styles(char a, char b, char c,
int print_count_a,
int print_count_b,
int print_count_c,
char output,
int output_index)
if(print_count_a == 1)
if(print_count_b == 1)
if(print_count_c == 1)
}
執行結果:
對於abc這樣的排列,或者aabc, abbc, aabbcc這樣的排列或者組合,都可以用類似方法解決;
乙個更一般的**:
#include #include #include #define print_d(intvalue) printf(#intvalue" is %d\n", (intvalue));
static bool i***ist(const char *str, const int str_size, char ch)
return false;
}void print_abc_all_styles(const char *elements, // be outputed elements
int max_print_count, // max printed elements
char output, // output string
const int output_size, // output string size
int output_index) // current output index
for(i = 0; i < strlen(elements); ++i)
}}int main()
; print_abc_all_styles("abc", 3, buf, 3, 0);
return 0;
}
q: 如何輸出一段字串?
a: 先輸出第乙個,然後將剩下的當做字串輸出;
q: 如何飛到月球?
a: 先飛第一段,然後飛剩下所有段;
q: 如何做一盤菜?
a: 先做菜的第一部分,然後做剩下的部分;
q: 如何追小妞?
a: 第一天採用某種方法和她相遇搭訕,後來採用類似但可能不同的方式找她搭訕,做該做的事,最後搞定她。不過涉及到情感問題,不能像計算機一樣,它是不穩定的。
q: 如何回家?
a: 做一件離你家更近的事情,然後繼續做類似的事情;
q: 如何上網?
a: 先做上網的第乙個準備工作,然後做剩下的工作;
q: 如何吃飯?
a: 先吃第一口,之後吃完所有該吃的飯。
q: 如何寫**?
a: 先寫第一句,後面寫完所有的**;
q: .........
a: .........
總之,不要認為回答的太簡單,而在於遞迴本來就很簡單。
xichen
2012-5-17 11:50:49
C語言遞迴習題 (1)
遞迴在各個考試中特別常考,因為考這類題目可以快速反應考生的程式設計思維水平。所以遞迴問題的練習是必不可少的。遞迴說難不難,說易不易,要把握關鍵的點,我們可以解決問題。我在這裡給幾道遞迴題目由易到難,希望給大家有所幫助。乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜...
前言 小話c語言 1
不知道該怎麼開頭,不過開頭的幾個字都寫了,就繼續寫下去吧。看過很多以大話開頭的書籍,覺得也不怎麼樣,覺得還沒達到大話的層次,本人本著謙虛的精神,暫且以小話開頭吧 可能讀者看完,覺得連小話都談不上,先不管這些了 如果讀者確實都覺得連小話都談不上,到時候我再改個名字好了,這樣至少也對得起文章的標題。言歸...
遞迴小程式二(C語言)
將非負十進位制整數n轉換成b進製。其中b 2 16 1 要實現進製的轉換,就是通過除法取餘數的方法,但通常得到的數都是要倒序輸出,所以通過函式的遞迴呼叫,在得到所有的位的計算結果後再輸出。2 若採用非遞迴方法,則需要用while 迴圈來計算,且計算結果用陣列存放,最後倒序輸出結果。拿十進位制轉二進位...