递归篇
# include <stdio.h>
/**
* 不同函数之间的相互调用
* 2016年6月18日21:11:00
*/
void f();
void g();
void k(); //必须要写声明,main调用f g k不是必须的,但是f g k之间相互调用时需要声明!
void f()
{
printf("FFFFFF\n");
g();
printf("111111\n");
}
void g()
{
printf("GGGGGG\n");
k();
printf("222222\n");
}
void k()
{
printf("KKKKKK\n");
}
int main(void)
{
f(); //输出FGK21
return 0;
}
p17_2:
# include <stdio.h>
/**
* 函数自己调用自己,递归
* 2016年6月18日21:22:55
*/
void f(int n)
{
if(n == 1)
printf("哈哈\n");
else
{
printf("gg\n");
f(n-1); //自己调用自己,递归
}
}
int main(void)
{
f(6); //输出:gggggggg哈哈
return 0;
}
p17_3:
# include <stdio.h>
/**
* 求阶乘的递归实现
* 2016年6月19日12:23:21
*/
int factorial(int);
int main(void)
{
int n = 4;
printf("%d\n", factorial(n));
return 0;
}
int factorial(int n)
{
if(1 == n) //==号:常数和变量倒过来写!!
return 1;
else
return (n*factorial(n-1));
}
p17_4:
# include <stdio.h>
/**
* 求阶乘的循环实现
* 2016年6月19日12:23:21
*/
int factorial(int);
int main(void)
{
int n = 4;
printf("%d\n", factorial(n));
return 0;
}
int factorial(int n)
{
int fac = 1;
for(n; n>=1; n--)
{
fac = n*fac;
}
return fac;
}
p17_5:
# include <stdio.h>
/**
* 求1+2+3+...100的递归实现
* 2016年6月19日12:53:17
*/
int sum(int);
int main(void)
{
int n = 100;
printf("%d\n", sum(n));
return 0;
}
int sum(int n)
{
if(1 == n)
return 1;
else
return (n+sum(n-1));
}
p17_6:
# include <stdio.h>
/**
* 以上阶乘、求和例子都是函数直接调用自己;这里讲函数间接调用自己
* 2016年6月19日12:53:17
*/
void f(int);
void g(int);
void f(int n)
{
g(n);
}
void g(int m)
{
f(m); //间接调用
}
int main(void)
{
f(5);
return 0;
}
P17_7:
# include <stdio.h>
/**
* 汉诺塔的实现:将A的n个盘子借助B移动到C
* 伪算法:
* if(n>1)
* {
* 1. 先把A的(n-1)个借助C移动到B;(与目标方式相同,只是改变了ABC位置,但是规模变小了!)
* 2. 将A的第n个盘子直接移动到C;
* 3. 再把B的(n-1)个盘子借助A移动到C(与1方式相同,只是改变了ABC位置)
* } s
* 2016年6月19日14:41:17
*/
void hannuota(int, char, char, char);
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入要移动盘子的个数: ");
scanf("%d", &n);
hannuota(n, ch1, 'B', 'C'); //汉诺塔:将A上的n盘子借助B移动到C(ps:ch1与'A'等价)
return 0;
}
/**
void hannuota(int n, char A, char B, char C)
{
如果是1个盘子
直接将A上的从A移到C
否则
先将A柱子上的n-1个盘子借助C移动B;
直接将A上的第n个盘子从A移动C;
将B上的n-1个盘子借助A移动C
}
*/
void hannuota(int n, char A, char B, char C) //A借助B移到C
{
if(1 == n)
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A,C );
else
{
hannuota(n-1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A,C );
hannuota(n-1, B, A, C);
}
}