專題:遞迴
阿新 • • 發佈:2020-11-01
不同函式之間互相呼叫
#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;
}