遞迴和簡單應用
阿新 • • 發佈:2018-12-18
遞迴:自己呼叫自己。
按步前進;規模逐漸縮小。需要說明邊界條件,返回值。
常用案例:
1.階乘
遞迴:
int Fac(int n)
{
if(n==1||n==0)
return 1;
else
return Fac(n-1)*n;
}
迴圈:
int Fac(int n)
{
int tmp=1;
for(int i = 1; i <= n; i++ )
{
tmp*=i;
}
return tmp;
}
2.求前n項的和
遞迴
int Sum(int n)
{
if(n==0)
return 0;
else
return Sum(n-1)+n;
}
循化
int Sum(int n)
{
int tmp=0;
for(int i=0 ; i<=n ; i++)
tmp+=i;
return tmp;
}
3.Fibon數列
遞迴
int Fibon(int n)
{
if(n==1||n==2)
return 1;
else
return Fibon(n-1)+Fibon(n-2);
}
迴圈
int Fibon(int n) { int f1=1; int f2=1; int f3; for(int i=0;i<=n;i++) { f3=f1+f2; f1=f2; f2=f3; } return f3; }
4.漢諾塔
#include<stdio.h>
void Move(char x,char y)
{
printf("%c->%c\n",x,y);
}
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
Move(a,c);
}
else
{
Hanoi(n-1,a,c,b);
Move(a,c);
Hanoi(n-1,b,a,c);
}
}
int main()
{
Hanoi(2,'A','B','C');
}
當漢諾塔的盤數大於2時,呼叫Hanoi函式以實現將n-1個盤從b移動到c。比如當n=2時,A->B,這時給Hanoi傳遞引數時調整b與c的順序,而Move移動時就把最上層的盤移動到b上了,Move(a,c)可以把a移動到b上,最後將a,b柱的位置調整,使得 Move(a,c)執行時將b上的盤移動到c。