1. 程式人生 > 其它 >如何理解函式的遞迴

如何理解函式的遞迴

技術標籤:c語言遞迴演算法

一、知識描述
學習函式遞迴首先要知道什麼是遞迴?
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。 遞迴的主要思考方式在於:把大事化小
遞迴的兩個必要條件
1、存在限制條件,當滿足這個限制條件的時候,遞迴便不再繼續。
2、每次遞迴呼叫之後越來越接近這個限制條件。

二、知識要點
1、Stack overflow 棧溢位:遞迴常見的錯誤。

最簡單的遞迴函式

int main()
{
	printf("hello world\n");
	main();
	return 0;
}

由這個遞迴函式,我想知道申請多少次記憶體空間會導致棧溢位,所以寫出了以下程式碼。

int main()
{
	int i = 1;
	i++;
	printf("hello world%d\n",i);
	main();
	return 0;
}

此時,我發現world後面列印的值保持為2,最後我發現是因為區域性變數和全域性變數的問題,所以對程式碼進行了以下調整。

int i = 1;
int main()
{
	i++
; printf("hello world%d\n",i); main(); return 0;

得到了棧溢位的申請次數。
在這裡插入圖片描述
2、接受一個整型值(無符號),按照順序列印它的每一位。例如:輸入1234,輸出1 2 3 4.(逆序)

void print(int n)
{
	if (n > 9)
	{
		printf("%d\n", n % 10);
		print(n / 10);
	}
	else 
	{
	printf("%d\n", n%10);
	}
}

int main()
{
	unsigned int num = 0
; scanf_s("%d",&num); print(num); return 0; }

3、編寫函式不允許建立臨時變數,求字串的長度
arr是陣列,傳參傳過去的不是整個陣列,而是首元素的地址。

int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "bit";
	//int len = strlen(arr);
	//printf("%d\n", len);
	int len = my_strlen(arr);//arr是陣列,傳參傳過去的不是整個陣列,而是首元素的地址。
	printf("len=%d\n", len);
	return 0;
}