数据结构入门5
前两天看的递归, 一直没发文章. 写了三个小程序用于理解递归的含义.
// 递归 求阶乘
#include<stdio.h>
long recurise(long num)
{
if (1 == num)
return 1;
else
return recurise(num-1) * num;
}
int main(void)
{
printf("%ld\n", recurise(100));
return 0;
}
/*
// 阶乘运算的一般实现
int main(void)
{
int val = 0;
int mult = 1;
printf("计算阶乘, 请输入数字: ");
scanf("%i", &val);
for(int i=0; i<val; ++i)
{
mult = mult * (i+1);
}
printf("%i的阶乘为: %i\n",val ,mult);
return 0;
}
*/
// 求1-100的和
#include<stdio.h>
long sum(int n)
{
if(n == 1)
return 1;
else
return sum(n-1) + n;
}
int main(void)
{
printf("%ld", sum(100));
return 0;
}
include<stdio.h>
/*
利用递归思想将问题规模减小
一共三根柱子A.B.C, n个盘子进行汉诺塔
将问题抽象之后, 问题就成为了三步:
- 先将n-1个盘子移动到B
- 然后将A柱上最大的盘子移动到C柱
- 最后将B柱上的n-1个盘子移动到C柱
其中, 将复杂步骤拆分成为三个步骤, 只是1.3步的问题规模较大.
然后可以继续将问题规模继续拆分, 开始移动n-2个盘子, 直至问题规模最小只移动1个盘子.
非线性递归
1 1
2 3
3 7
......
总步骤应该是 2^n -1
*/
void hanoi(int num, char start, char middle, char finals)
{
if (num == 1)
{
printf("将%d盘子直接从%c移动到%c柱\n", num, start, finals);
}
else
{
// n-1个盘子借助
hanoi(num-1, start, finals, middle); // 初始start 利用 最终finals 将 n-1 移动至 中间middle
printf("将%d盘子直接从%c移动到%c柱\n", num, start, finals);
hanoi(num-1, middle, start, finals); // 中间middle 利用 初始start 将 n-1 移动至 最终finals
printf("将%d盘子直接从%c移动到%c柱\n", num, middle, finals);
}
}
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("输入要移动的个数: ");
scanf("%i", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}