## 函數調用
通常,當一個函數運行期間調用另一個函數時,在運行被調函數之前,系統需要完成3件事:
(1)將所有的實參,返回地址(個人理解是調用被調函數時的下一個語句的地址)等信息傳遞給被調函數保存。
(2)為被調函數的局部變量分配存儲空間。
(3)將控制轉移到被調函數入口。
從被調函數返回調用函數之前,系統完成3件事:
(1)保存被調函數的計算結果。
(2)釋放被調函數的數據區。
(3)依照被調函數保存的返回地址,將控制轉移到調用函數。
## 遞歸:
一個函數自己直接或間接調用自己。
思想就是:將問題規模不斷縮小,化繁為簡,求n!轉化成(n-1)!,再轉換成(n-2)!.......最后轉換成(1)!.
?有如漢諾塔問題,如果初始有10個砝碼,要從A移動到C,這個看起來比較復雜。只要把前9個移動到B,然后移動第10個到C。那這9個怎么移動呢,也用這種方式。。。這就是遞歸實現漢諾塔詳細代碼見最下方
### 循環和遞歸比較:
遞歸:
易于理解
速度慢
存儲空間大
循環
不易于理解
速度快
存儲空間小
### 遞歸應用:? ??
1.求階乘
2.1+2+3+4+。。。+100的和
3.漢諾塔
4.走迷宮(CS的實現)
遞歸的運用:
樹和森林就是以遞歸的方式定義的
樹和圖的很多算法都是以遞歸來實現的
很多數學公式就是以遞歸的方式定義的
斐波拉契序列
12 3 5 8 13 21 34。。。
C語言實現漢諾塔:
~~~
#include<stdio.h>
void hanota(int num,char A,char B,char C)
{
//如果只有一個元素,那么直接把這個元素,移動到C
if(1==num)
{
printf("把第%d個元素從%c移動到%c\n",num,A,C);
}else{
//如果不是第一個元素,先把前n-1個元素,借助C移動到B
hanota(num-1,A,C,B);
//然后把A最下面的元素移動到C
printf("把第%d個元素從%c移動到%c\n",num,A,C);
//然后再把B上的元素借助A移動到C
hanota(num-1,B,A,C);
}
}
int main()
{
char A='A';
char B='B';
char C='C';
hanota(3,A,B,C);
return 0;
}
~~~
現實生活中,如果我們解決的問題比較繁瑣,不妨把問題規模減小考慮。