重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这个应该是计算阶乘的递归函数
专注于为中小企业提供网站建设、成都网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业吕梁免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了近1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
其实递归函数的结构很简单,一般是两部分组成
1、判断是否结束递归。
作用是结束递归调用,递归调用不可能无限的调用下去,要不然成了死循环了,呵呵
所以要有一个结束的条件,如这里的if(n==0||n==1) return 1
2、调用本身(或者其他函数(有双线递归和多线递归))
这里就是递归的本质函数了,他有两个地方要注意
1)就是递归的公式,以什么条件来运算
这里的公式是递归函数的返回值和参数相乘
2)就是需要改变函数的参数,要不然也会成为死循环
这里是fac(n-1),这个n-1就是改变了参数
多线递归和这个也差不多,只有一个地方不同,就是调用的函数不是本身,是另一个递归函数
如a调用b,b在调用c,c调用a等等
楼主的程序有两处错误,给你修正了一下:
局部两边x没有引用,给你删掉
main函数没有定义类型,加void
#include stdio.h
void fun(int n)
{
int d,y;//x给你删掉了
d=n%2;
y=n/2;
if(y!=0)
{
fun(y);
}
printf("%d",d);
//putchar('\n');这个没用我给你注释了
}
void main()
{
int n;
printf("enter a number\n");
scanf("%d",n);
if(n0)
printf("Input data error\n");
else
fun(n);
putchar('\n')//最后才调用这句代码
}
下面给你分析一下:
fun()函数是一个递归函数,什么意思呢?意思就是它会调用本身,每次函数都会先执行代码d=n%2;y=n/2;然后在判断n是否大于0,如果n大于0,函数继续回调,如果n=0,函数就结束了回调,整个程序也就完成了。
至于你说的执行完了这句还会不会执行后面的printf("%d",d);这是肯定的,因为要输出啊,给你看看运行结果
递归函数有三点要求:
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合并
}
递归函数:
编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。
在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。
函数介绍:
在数理逻辑和计算机科学中,递归函数或μ-递归函数是一类从自然数到自然数的函数,它是在某种直觉意义上是"可计算的" 。事实上,在可计算性理论中证明了递归函数精确的是图灵机的可计算函数。递归函数有关于原始递归函数,并且它们的归纳定义(见下)建造在原始递归函数之上。但是,不是所有递归函数都是原始递归函数 — 最著名的这种函数是阿克曼函数。
其他等价的函数类是λ-递归函数和马尔可夫算法可计算的函数。
例子:
//代码1
void func()
{
//...
if(...)
func();
else
//...
}
条件:
一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:
1) 在每一次调用自己时,必须是(在某种意义上)更接近于解;
2) 必须有一个终止处理或计算的准则。
梵塔的递归函数:
//C
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}