数据结构是学习编程路上的重要一步,也为以后学习算法打下基础,数据结构又称算法与数据结构,与算法密不可分,是计算机软件专业的核心课程,其重要性不言而喻。
递归分为递推与回归两个过程,递归的优点是容易理解,方便编程,可以解决很多问题,缺点是需要不断的调用递归,时间效率慢,空间占用大。
递归示例:
# include <stdio.h>
int f(int n)
{
//printf("1");
n = f(n);
return n;
//return f(n); //递归,必须设置一个终止条件,即必须在一定条件下执行return语句,否则将无限递归。
}
//递归的数值必须是变动的,可增可减,但必须有一个上下限,达到上下限后递归终止返回,其递归的规模始终是递减的。
int g(int n)
{
if (n > 9)
printf("哈哈!\n");
else
n = g(n+1); //值增大,规模在减小。
return n;
}
int main(void)
{
int m, n;
m = f(5);
printf("%d\n", m);
n = g(5);
printf("%d\n", n);
return 0;
}
递归示例:
# include <stdio.h>
void f();
void g();
void k();
//函数间的互相调用及其返回顺序
int main(void)
{
f();
return 0;
}
void f()
{
printf("FFFF\n");
g();
printf("1111\n");
}
void g()
{
printf("GGGG\n");
k();
printf("2222\n");
}
void k()
{
printf("KKKK\n");
}
递归必须设置结束条件,不能无限递归:
# include <stdio.h>
void f();
int main()
{
f();
return 0;
}
void f()
{
printf("哈哈!\n");
f();
}
//进行递归所用的栈满后,溢出,程序出错而停止。
//递归不能出现死递归,必须设置递归结束的条件。
递归的调用:
# include <stdio.h>
void f(int);
void g(int);
int main(void)
{
return 0;
}
//f函数与g函数间接调用自己
void f(int n)
{
g(n);
}
void g(int m)
{
f(m);
}
//k函数直接调用自己
void k(int val)
{
k(val-1);
}
递归求和:
# include<stdio.h>
int f(int n)
{
if (1 == n)
return 1;
else
return f(n-1) + n; //n与前一个结果的和
}
int main(void)
{
int i, val;
int sum;
printf("请输入自然数求和上限:val = ");
scanf("%d", &val);
sum = f(val);
printf("求和结果为:sum = %d\n", sum);
return 0;
}
汉诺塔问题(很经典的程序,适合递归来解决):
# include <stdio.h>
void hannuota(int, char, char, char);
int main(void)
{
int n;
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
printf("请输入盘子的个数:");
scanf("%d", &n);
hannuota(n, ch1, ch2, ch3);
return 0;
}
void hannuota(int n, char A, char B, char 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);
}
}
阶乘(循环实现):
递归与循环在一定程序上可以互相实现的。
# include <stdio.h>
int main(void)
{
int val;
int i;
int mult = 1;
printf("请输入阶乘上限数字:val ="); //注意,当输入数字过大时,结果显示为0,因为栈溢出。
scanf("%d", &val);
//用循环实现阶乘
for (i=1; i<=val; ++i)
{
mult = mult*i;
}
printf("%d的阶乘结果是:%d\n", val, mult);
return 0;
}
阶乘(递归实现):
# include <stdio.h>
//用递归实现
long f(long n)
{
if (1 == n)
return 1; //递归是一个规模不断缩小的计算,必须设置达到最小值时的返回值。
else
return f(n-1) * n;
}
//n的解决必须借助n-1的结果,不断递减,最后回归。
//递归分为递推与回归两个方面。
int main(void)
{
int i, val;
long mult;
printf("请输入阶乘数字上限:val = ");
scanf("%d", &val);
mult = f(val);
printf("%d的阶乘结果是:%ld\n", val, mult);
return 0;
}