目录
一、初级应用
二、中级应用
三、高级应用
一、初级应用
//初级 - 斐波那切数列
int fib(int n)
{
if(n <= 2)
{
return 1;
}
else
{
return fib(n-1) + fib(n-2);
}
}
int main()
{
for(int i=1; i <= 10; i++)
{
printf("%d\t",fib(i));
}
}
?1 ? ? ? 1 ? ? ? 2 ? ? ? 3 ? ? ? 5 ? ? ? 8 ? ? ? 13 ? ? ?21 ? ? ?34 ? ? ?55
二、中级应用
//中级应用 - 汉诺塔游戏
void hnt(int n,
const char *start , //起始柱
const char *mid , //中间柱
const char *dest) //目标柱
{
if(n == 1 )
{
printf("从%s移动到%s\n",start , dest);
return ;
}
else
{
hnt(n-1 , start , dest , mid); //中间柱变成了目标柱
printf("从%s移动到%s\n",start,dest);
hnt(n-1 , mid , dest , start);
}
}
int main()
{
hnt(3, "A柱","B柱","C柱");
return 0;
}
从A柱移动到C柱 从A柱移动到B柱 从C柱移动到A柱 从A柱移动到C柱 从B柱移动到C柱 从B柱移动到A柱 从C柱移动到B柱
三、高级应用
//高级应用 -
//对于指定的数字,请列出所有的排列组合
//例如:3的排列组合
// 1 2 3 、 1 3 2 、2 1 3 、 2 3 1 、 3 1 2 、 3 2 1
#include<stdio.h>
#define N 3 //可以改变数值
int used[N] = {0}; //0:未被使用 1:已经使用
int data[N] = {0}; //用来存放我们使用的数字
void work(int i) //i表示已经放入了i个数据
{
for(int j = 0; j < N; j++) //对所有的数字搜索一遍
{
//取出一个可以使用的数字
if(used[j] == 0) // = 0:数字j还未被使用
{
//...马上使用数字j
data[i] = j; //
//修改标记
used[j] = 1;
if(i == N-1) //塞满了就打印
{
for(int k=0; k<N; k++)
{
printf("%d ",data[k]+1);
}
putchar('\n');
}
else //没塞满就继续塞
{
work(i + 1);
}
//清理现场
used[j] = 0;
}
}
}
int main()
{
work(0);
}
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
|