一.什么是递归
递归是一种不断调用自身的函数,按名字来看,递归分为递进和回归,在符合条件时递进,不符合条件后停止递进,开始回归
二.递归适用情况
递归适用于有规律的递增递减,例如:求阶乘,斐波那契数列等
#include<stdio.h>//阶乘
int b(int n)
{
if (n > 1)
return n * b(n - 1);
else
return 1;
}
int main()
{
int n;
scanf("%d", &n);
int c = b(n);
printf("%d", c);
return 0;
}
在程序中输入3,3>1,所以b(3)->3*(b(2))->3*(2*(b(1)))->3*(2*1)->3*2->6
#include<stdio.h>//斐波那契数列
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n=0;
scanf("%d", &n);
int a = Fib(n);
printf("%d", a);
return 0;
}
在程序中输入4,大于2,Fib(4)=Fib(3)+Fib(2)=(Fib(2)+Fib(1))+Fib(1)
三.优缺点
优点:1.代码结构简单
2.能解决用循环解决较为困难的问题
缺点:1.运算量较大,会重复运算,速度较慢,占用内存大
四.杨辉三角
#include<stdio.h>
int func(int j, int k)
{
if (k == 0 || k == j)
return 1;//在第一列和最后一列时的值1
else
return func(j -1, k) + func(j - 1, k-1);//通过该函数实现杨辉三角的数字计算
}
int main()
{
int n, j, k,i;//n表示输出总行数,j表示行数,k表示列数,i表示正在输出第几行
printf("求几行杨辉数列?\n");
scanf("%d", &n);
for (i = 0;i <= n;i++)
{
for (j = 0;j < n - i;j++)
printf(" ");//通过空格数量来完成队形
for (k = 0;k <= i;k++)
{
printf("%4d", func(i, k));//d前的数字为空格数的二倍,才能对齐
}
printf("\n");
}
return 0;
}
注:写递归时应有跳出条件,否则会导致栈溢出