1. 程式人生 > >c語言中遞迴的學習

c語言中遞迴的學習

在學習c語言函式部分時,有一個非常重要的知識就是遞迴了。

首先遞迴就是程式呼叫自身的程式設計技巧,遞迴作為一種演算法在程式設計語言中廣泛應用。一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型的複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需要少量的程式就可以描述出接替過程所需要的多次重複計算,大大地減少了程式的程式碼量。

而在使用遞迴時必須要有兩個必要條件:(1)存在限制條件,當滿足這個限制條件時,遞迴便不再繼續;(2)每次遞迴條用之後都越來越接近這個限制條件

下面是幾個簡單的遞迴示例:

//遞迴和非遞迴分別實現求第n個斐波那契數
#include<stdio.h>
#include<stdlib.h>
//非遞迴實現
int fab(int i)
{	
	int n1 = 1, n2 = 1;
	int n3 = 0;
	if (i == 1 || i == 2)
	{
		return 1;
	}
	else
	{
		for (int k = 3; k <= i; ++k)
		{
			n3 = n1 + n2;
			n1 = n2;
			n2 = n3;
		}
		return n3;
	}
}
//遞迴實現
int fab(int i)
{
	if (i == 1 || i == 2)
		return 1;
	else
	{
		return fab(i - 1) + fab(i - 2);
	}
}
int main()
{
	int i = 0, ret = 0;
	scanf("%d", &i);
	ret = fab(i);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
//遞迴實現:將引數字串中的字元反向排列(不使用字串操作函式)。
#include<stdio.h>
#include<stdlib.h>
void reverse_string(char* string)
{
	if (*string != '\0')
	{
		string++;
		reverse_string(string);
		printf("%c", *(string - 1));
	}
}
int main()
{
	char string[] = "asdfghjkl";
	reverse_string(string);
	system("pause");
	return 0;
}
//遞迴和非遞迴分別實現strlen 
#include<stdio.h>
#include<stdlib.h>
//遞迴實現
int Strlen(char* string)
{
	if (*string == '\0')
		return 0;
	else
		return 1 + Strlen(string + 1);
}
//非遞迴實現
int Strlen(char* string)
{
	int i = 0;
	while (1)
	{
		if (*string != '\0')
		{
			string += 1;
			i++;
		}
		else
			break;
	}
	return i;
}
int main()
{
	char string[] = "asdfghjkl";
	int len = 0;
	len = Strlen(string);
	printf("%d\n", len);
	system("pause");
	return 0;
}

可以看出使用遞迴之後,程式碼相比非遞迴變得簡單許多,但是在計算第n個斐波那契數或者n的階乘時如果n過於大的話,遞迴的計算時間會比較長甚至會崩潰,這個時候,我們就使用非遞迴實現就更好一些。同時遞迴的方法邏輯性很強,而非遞迴的方法,思路比較清晰,對於初學者也更加容易理解。但是再熟悉了遞迴的方法後,依舊可以在我們後面的問題學習中帶來便利。