十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这个应该是计算阶乘的递归函数
黑山网站建设公司创新互联建站,黑山网站设计制作,有大型网站制作公司丰富经验。已为黑山上千提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的黑山做网站的公司定做!
其实递归函数的结构很简单,一般是两部分组成
1、判断是否结束递归。
作用是结束递归调用,递归调用不可能无限的调用下去,要不然成了死循环了,呵呵
所以要有一个结束的条件,如这里的if(n==0||n==1) return 1
2、调用本身(或者其他函数(有双线递归和多线递归))
这里就是递归的本质函数了,他有两个地方要注意
1)就是递归的公式,以什么条件来运算
这里的公式是递归函数的返回值和参数相乘
2)就是需要改变函数的参数,要不然也会成为死循环
这里是fac(n-1),这个n-1就是改变了参数
多线递归和这个也差不多,只有一个地方不同,就是调用的函数不是本身,是另一个递归函数
如a调用b,b在调用c,c调用a等等
从主函数开始运行,遇到调用函数时,直接跳到下面的函数定义中运行,然后把返回值带到主函数,继续运行主函数下面的部分。
#includestdio.h
void main()
{
int diecheng(int num); \\声明函数
printf("%d",diecheng(5)); \\diecheng(5)即为调用此函数,实参为5
}
int diecheng(int num) \\定义函数
{
int result;
if(num==0)
result=1;
else
result=num*diecheng(num-1);
\\因为实参为5,所以运行else下面的,result=5*(5-1)即为20
return result; \\返回result的值(即20)到主函数的printf语句中,从而打印出来
}
递归函数有三点要求:
1,递归的终止点,即递归函数的出口
2,不断的递归调用自身
3,递归函数主体内容,即递归函数需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。
具体例子如下:
void fun(int n)
{
if(n=0) return; //1 这是递归的终点,即出口
fun(n-1); //2、递归函数自身的调用
coutnendl; //3 递归函数的主体内容
}
2,3合并的情况
int fun(int n)
{
if(n=0) return 0;
return fun(n-1)+fun(n-2); //2 3合并
}
#include stdio.h
/*比如一个判断一棵二叉树是否为满二叉树的函数*/
typedef struct btnode{
int data;
struct btnode *lchild;
struct btnode *rchild;
} BTnode;
// 返回最大值
int max(int a, int b)
{
return a b ? a : b;
}
// 返回树的高度
int level(BTnode *bt)
{
if (NULL == bt) return 0;
return max(level(bt-lchild), level(bt-lchild)) + 1;
}
// 是满二叉树返回1,不是返回0;
int bt_juge(BTnode *bt)
{
return
NULL == bt || // 空树是满的,或
level(bt-lchild) == level(bt-rchild) // 左右子树高度相同,且
bt_jude(bt-lchild) bt_jude(bt-rchild); // 左右子树都是满的
}
你原来的程序相当于这样:(“只有一个根节点的二叉树是满二叉树”这个判断没有必要,可省略)
#include stdio.h
/*比如一个判断一棵二叉树是否为满二叉树的函数*/
typedef struct btnode{
int data;
struct btnode *lchild;
struct btnode *rchild;
} BTnode;
// 是满二叉树返回 1,不是返回 0
int bt_juge(BTnode *bt, int *level)
{
int l, r, a, b;
if (NULL == bt)
{
*level = 0; // 空树的高度为 0
return 1; // 空树是满的
}
a = bt_jude(bt-lchild, l); // 判断左子树是否满,并接收左子树的高度 l
b = bt_jude(bt-rchild, r); // 判断右子树是否满,并接收右子树的高度 r
*level = (l r ? l : r) + 1; // 这里把树本身的高度传递回调用它的程序
return a b (l == r); // 左右子树都满,且高度相同,则是满的
}