C語言遞歸函數講解
遞歸函數是什麽?
是函數、、、、、、、、、、、、、、、、、、、、
你可以把它理解成是for循環與死循環的結合的函數。簡單的說:遞歸函數是有條件終止的死循環函數;
死循環函數是指在函數體中調用自身;
舉個列子:
用遞歸函數算出1*2*3*4*..........*n的值
int test_1(int n)
{
if(n==0) //終止遞歸函數的循環
retrun 1; //1*(最終值) = (最終值)
else
retrun test(n-1) *n; //調用自身,參數-1,得到值,最後會得到最終值
/*過程:
1. test(3)*4;
2. test(2)*3*4;
3. test(1)*2*3*4;
4. test(0)*1*2*3*4;
註意,這裏——( 上面的test(0)又會重新進入test,此時retrun 1 )
所以步驟4實際上就是: 1*1*2*3*4;
實際上元素:1,2,3,4都是使用了的,所以最終值就是(1*2*3*4),而另外的一個1(test(0))只是讓test函數不再循環下去的一個條件裏面的語句;
也就是說在if裏面可以返回任何值res,不一定只是返回1。但是必須滿足res*1*2*3*4 = 1*2*3*4;這裏的語句要根據4步驟來決定;
我們回看4步驟:test(0)*1*2*3*4——test(0)會進入if條件裏面,也就終止調用自身,終止了函數循環,然後返回值是1
所以test(0)*1*2*3*4 = 1*1*2*3*4
*/
}
void main()
{
int res = test(4);
printf("值=%d\n",res);
}
以上就是遞歸函數;
遞歸函數邏輯思維要求比較高,有些企業面試的時候也會涉及這類問題;
我們可以看到這只是一個返回值為int 的遞歸函數,遞歸函數可不止這一種;
——還有遞歸函數操作數組,遞歸函數打印圖案或者文字,遞歸函數甚至可以操作指針這些;
萬變不離其宗,下面舉一些例子:
// 1、給一個空的字符數組添加元素,(利用遞歸)
void homeWork_2(char a[],int n)
{
if(n==0)
printf("");
else{
a[n-1] =(‘a‘+(n-1));
homeWork_2(a, n-1);
}
}
// 2、利用數組名進行傳參,進行數組的求和。
int sum(int a[],int n){
if(n==0)
return 0;
else
return sum(a,n-1) + a[n-1];
}
int main(int argc, const char * argv[]) {
int arrs[7] = {1,2,3,4,5,6,7};
int res = sum(arrs, 7);
printf("數組和是:%d\n",res);
這裏簡單舉了兩個例子,遞歸函數一定要多去思考邏輯和多去敲代碼;只要邏輯清晰,代碼熟練,無論是操作整型,數組,指針等等都是一樣的。
C語言遞歸函數講解