在C語言中,函數遞歸是一種函數調用自身的技術。遞歸函數通常用于解決可以分解為更小、類似子問題的問題。遞歸函數有兩個基本部分:
- 基本情況(Base Case):這是遞歸的終止條件,即函數停止遞歸并返回值的條件。
- 遞歸步驟(Recursive Step):這是函數將問題分解為更小問題的步驟,并在解決子問題后使用這些解來構建對原始問題的解。
以下是一個使用遞歸計算階乘(factorial)的C語言示例:
#include <stdio.h>// 遞歸函數計算階乘
unsigned long long factorial(unsigned int n) {// 基本情況:0的階乘是1if (n == 0) {return 1;}// 遞歸步驟:n的階乘是n乘以(n-1)的階乘else {return n * factorial(n - 1);}
}int main() {unsigned int number;printf("Enter a non-negative integer: ");scanf("%u", &number);printf("%u! = %llu\n", number, factorial(number));return 0;
}
在這個例子中,factorial
函數接受一個無符號整數n
作為輸入。如果n
是0,它返回1(這是階乘的定義)。否則,它返回n
乘以(n-1)
的階乘。注意,(n-1)
的階乘是通過再次調用factorial
函數來計算的,這就是遞歸的部分。
遞歸函數必須有一個或多個基本情況,否則它們將無限遞歸下去,導致棧溢出。在上面的例子中,基本情況是n == 0
。
另一個常見的遞歸示例是斐波那契數列(Fibonacci sequence),其中每個數字是前兩個數字的和:
#include <stdio.h>// 遞歸函數計算斐波那契數列
unsigned long long fibonacci(unsigned int n) {// 基本情況if (n <= 1) {return n;}// 遞歸步驟else {return fibonacci(n - 1) + fibonacci(n - 2);}
}int main() {unsigned int number;printf("Enter a non-negative integer: ");scanf("%u", &number);printf("Fibonacci(%u) = %llu\n", number, fibonacci(number));return 0;
}
請注意,雖然遞歸代碼在某些情況下非常簡潔和優雅,但遞歸函數可能會比等效的迭代函數消耗更多的內存和計算時間,因為它們需要在每次函數調用時保存狀態信息。因此,在設計遞歸函數時,需要權衡代碼的簡潔性和性能。