1. 程式人生 > 實用技巧 >專題:遞迴

專題:遞迴

不同函式之間互相呼叫

#include <stdio.h>

void f();
void g();
void k();

int main()
{
	f();

	return 0;
}

void f()
{
	g();
	printf("11\n");
}

void g()
{
	printf("22\n");
	k();
}

void k()
{
	printf("哈哈\n");
}

自己呼叫自己

#include <stdio.h>

void f(int );

int main()
{
	f(3);

	return 0;
}

void f(int n)
{
	if(1 == n)	//變數放右邊,常量值放左邊[好習慣]
	{
		printf("哈哈\n");
	}
	else
	{
		f(n-1);
	}
}

A函式呼叫B函式

A函式呼叫B函式舉例1

#include <stdio.h>

//直接呼叫

int f(int n);

int main()
{

	int val;

	val = f(5);
/*
當在main函式的執行期間呼叫f函式時,在執行被調函式之前,系統需要完成三件事
	1. 將所有的實際引數,主調函式下一條語句的返回地址等資訊傳遞給被調函式f儲存
	2. 為被調函式f的區域性變數(也包括形參)分配儲存空間
	3. 將控制轉移到被調函式f的入口
*/
	printf("val = %d\n", val);

	return 0;
}


int f(int n)
{
	n += 2;

	return n;
/*
從被調函式返回主函式之前,系統也要完成三件事
	1. 儲存被調函式f的返回結果
	2. 釋放被調函式f所佔的儲存空間
	3. 依照被調函式f儲存的返回地址將控制轉移到主呼叫函式main
*/
}

A函式呼叫B函式舉例2

#include <stdio.h>

//間接呼叫

int f(int m);
int g(int n);

int main()
{
	int val;

	val = f(5);
	printf("val = %d\n", val);

	return 0;
}

int f(int m)
{
	m = g(m);

	return m;
}

int g(int n)
{
	n *= 2;

	return n;
}

A函式呼叫A函式舉例

#include <stdio.h>

int f(int n);

int main()
{
	int val;
	 
	val = f(5);

	return 0;
}

int f(int n)
{
	if(3 > n)
	{
		printf("哈哈\n");
	}
	else
	{
		n = f(n-1);
	}

	return n;
}

遞迴應用

1. 求階乘

#include <stdio.h>

void f(long n);
long g(long m);

//for迴圈實現
/*
int main()
{
	int val;

	printf("請輸入一個數字:");
	printf("val = ");
	scanf("%d", &val);

	f(val);

	return 0;
}

void f(long n)
{
	int i; 
	long mult = 1;   //mult: multiple

	for(i = 1; i<=n; i++)
	{
		mult = mult * i;
	}
	printf("%ld的階乘是:%ld\n", n, mult);
	return;
}
*/
/*——————————————————————————————————————*/

//遞迴實現
int main()
{
	long mult;	 //mult: multiple

	mult = g(3); //假定m是大於或等於0的值

	printf("3的階乘是:%ld\n", mult);

	return 0;
}

long g(long m)
{
	if(1 == m || 0 == m)
	{
		return 1;
	}
	else
	{
		return g(m-1) * m;
	}
}

2. 1+2+3+4+...100的和

#include <stdio.h>

long sum(int n);

int main()
{
	
	printf("100以內的整數和是:%d\n", sum(100));

	return 0;
}

long sum(int n)
{
	if(1 == n)
	{
		return 1;
	}
	else 
	{
		return sum(n-1)+n;
	}
}

3. 漢諾塔

#include <stdio.h>

void hanoi(int, char, char , char);

int main()
{
	int n;
	char A = 'A';
	char B = 'B';
	char C = 'C';

	printf("請輸入需要移動盤子的個數:\n");
	scanf("%d", &n);

	hanoi(n, A, B, C);

	return 0;
}

void hanoi(int n, char a, char b, char c)
{
	if(1 == n) //此時是原柱子【沒有移動前】最上方的一個盤子,編號為1
	{
		printf("把編號為%d的盤子	直接從%c移動到%c上\n", n, a, c);
	}
	else
	{
		//		  源頭 藉助 目標   
		hanoi(n-1, a,   c,   b);	
		printf("把編號為%d的盤子	從%c移動到%c上\n", n, a, c);
		hanoi(n-1, b, a, c);
	}
}

//該函式所處理的資料規模必須在遞減[要解決n個問題,必須先解決n-1個問題]

//假定此題需要移動5個盤子,就需要先把上面4個盤子移到另一個柱子,要移動4個盤子,就需要先把上面3個盤子移到另一個柱子......

4. 斐波拉契數列

#include <stdio.h>
 
int f(int i);
 
int f(int i)
{
    if (i == 0 || i == 1)
	{
        return i;
    }
    else 
	{
        return f(i - 1) + f(i - 2);
    }
}
 
int main()
{
    int i, n;
 
    n = 20;
    for (i = 0; i < n; i++)
	{
        printf("F(%d) = %d\n", i, f(i)); 
    }
 
    return 0;
}