1.定義算法
一個函數直接或間接的調用本身函數
2.舉例blog
1)求階乘遞歸
2)1+2+3+4+……+10原理
3)漢諾塔循環
4)走迷宮im
(1)(2)求階乘,求累加db
a.循環解決img
int main()
{
int val;
int i, mult = 1;
printf("請輸入一個數字:");
printf("val = ");
scanf("%d", &val);
for (i=1; i<=val; i++)
{
mult = mult * i;
}
printf("%d的階乘是%d",val, mult);
return 0;
}移動
b.遞歸解決
//假定n的值是1或者大於1的值
long f(long n)
{
if (1 == n)
{
return 1;
}
else
{
return f(n-1) * n; //若是求的是累加 則return f(n-1) + n
}
}
int main()
{
int n;
printf("請輸入一個數字:");
printf("n = ");
scanf("%d", &n);
printf("%d的階乘是%d",n, f(n));
return 0;
}
(3)漢諾塔
僞算法
先把A柱子上的前n-1個盤子從A藉助C移到B
將A柱子上的第n個盤子直接移到C
再將B柱子上的n-1個盤子藉助A移到C
代碼實現
void hanoi(int n, char A, char B, char C)
{
/*
次數爲2的n次方減1次
若是是一個盤子
直接將A柱子上的盤子移動到C柱子上
否者
先將A柱子上的n-1個盤子藉助C移動到B柱子
A B C
n-1 -> ->n-1
n-1 <-n-1
n-1-> n-1
再將A柱子上的盤子從A移到C
A C
結果第n個 -> 第n個
最後將B柱子上的n-1個盤子藉助A移到C
A B C
n-1 <-n-1
n-1 ->n-1
n-1 ->n-1
*/
if (1 == n)
{
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);
}
}
int main()
{
int n;
printf("請輸入要移動盤子的個數:");
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
3.原理
間接調用
f()調用g(),g()調用k()
本身調用
f(n)調用f(n-1),f(n-1)調用f(n-2),一直到沒法調用爲止
4.循環和遞歸區別
遞歸
易於理解
速度慢
存儲空間大
循環
不易理解
速度快
存儲空間小