A. c语言中如何从无返回值的递归函数中退出
不会被执行.
从递归函数随时退出,可以直接返回不再调用自身,或者在返回时设置一个返回值告诉上一个函数不用再调用这个函数了.
至于用GOTO语句可能不行吧,GOTO语句好象只能在函数内使用.
B. c语言的 递归函数,是不是这个样子的,弹栈就逐个弹出!
是的。
简单说:
每次调用递归函数:
入栈:为被调函数保存实参、返回地址等信息、分配局部变量空间、并将控制转移到被调函数入口。
最后一次调用的的递归函数,先出栈,之前调用函数依次出栈。
出栈:保存当前函数返回值、释放数据空间、并将控制转移到其调用函数。
C. C语言中,如何立即跳出递归函数
直接跳出应该不可以,可以加一个short
bl;变量,标识是不是要退出。
D. 讲一下c语言中递归函数的使用方法
相当于循环,要有判断条件,传递进去的参数要变化,满足条件调用自身,不满足条件就开始一层一层返回。简单例子:
int
f(int
i){
int
sum=0;
if(i>0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}
E. c语言中递归函数的运行过程
递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果
汉诺塔问题:对汉诺塔问题的求解,可以通过以下3个步骤实现:
(1)将塔上的n-1个碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一个碟子移到塔C上;
(3)将n-1个碟子从塔B借助塔A移到塔C上。
在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况,具体方法如下:
(1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序;
(2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;
(3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序
三、递归函数的内部执行过程
一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:
(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。
上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返回地址对应算法中语句的行号,分图的序号对应图中递归调用和返回的序号
我可以帮助你,你先设置我最佳答案后,我网络Hii教你。
F. 在C语言中,怎样从一个递归函数中随时退出
exit()是退出整个程序,函数后面的任何代码都不会被执行.
从递归函数随时退出,可以直接返回不再调用自身,或者在返回时设置一个返回值告诉上一个函数不用再调用这个函数了.
至于用GOTO语句可能不行吧,GOTO语句好象只能在函数内使用.
G. c语言的递归函数 怎么运行的
这个应该是计算阶乘的递归函数
其实递归函数的结构很简单,一般是两部分组成
1、判断是否结束递归。
作用是结束递归调用,递归调用不可能无限的调用下去,要不然成了死循环了,呵呵
所以要有一个结束的条件,如这里的if(n==0||n==1) return 1
2、调用本身(或者其他函数(有双线递归和多线递归))
这里就是递归的本质函数了,他有两个地方要注意
1)就是递归的公式,以什么条件来运算
这里的公式是递归函数的返回值和参数相乘
2)就是需要改变函数的参数,要不然也会成为死循环
这里是fac(n-1),这个n-1就是改变了参数
多线递归和这个也差不多,只有一个地方不同,就是调用的函数不是本身,是另一个递归函数
如a调用b,b在调用c,c调用a等等
H. c语言数据结构 递归创建二叉树的函数如何输入退出这个函数一直让输入 无论输入什么 都无法结束输入
递归创建二叉树的输入是有讲究的,可参考:网页链接中最后的输入示例:如果你用#作为结束,则对应输入:1 2 4 # 6 ###3 #5 #7 #8 ##
再给个递归创建二叉树的例子:
#include<stdio.h>
#include<stdlib.h>
typedefstructTree{
intVal;
structTree*left;
structTree*right;
}Tree;
Tree*CreateBiTree(void)
{
Tree*T;
intval;
scanf("%d",&val);
if(val==0)
T=NULL;
else
{
T=(Tree*)malloc(sizeof(Tree));
T->Val=val;
T->left=CreateBiTree();
T->right=CreateBiTree();
}
returnT;
}
voidPrint(Tree*root)
{
if(root!=NULL)
{
Print(root->left);
printf("%d",root->Val);
Print(root->right);
}
}
intmain()
{
Tree*root=CreateBiTree();
Print(root);
return0;
}
以上面的输入例子1 2 4 # 6 ###3 #5 #7 #8 ##为例,对应的输入为:1 2 30 6000 30 50 70 80 0
运行结果:
#include<iostream>
usingnamespacestd;
typedefstructTree{
intVal;
structTree*left;
structTree*right;
}Tree;
voidCreateBiTree(Tree*&T)
{
intval;
cin>>val;
if(val==0)
T=NULL;
else
{
T=newTree;
T->Val=val;
CreateBiTree(T->left);
CreateBiTree(T->right);
}
}
voidPrint(Tree*root)
{
if(root!=NULL)
{
Print(root->left);
cout<<root->Val<<'';
Print(root->right);
}
}
intmain()
{
Tree*root;
CreateBiTree(root);
Print(root);
return0;
}
看了一下你的递归部分的代码,是正确的,没问题。
I. c语言递归函数
递归函数:
编程语言中,函数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);
}
}
J. 怎样强制退出递归函数
这个是不可以的,除非强制退出整个程序的执行,比如使用exit(0);这样的语句。
C语言的函数调用是一层一层的,本层函数执行完会返回上一层函数执行,如果一个递归函数已经调用了10层了,不可能说支持退出这十层函数的执行,直接返回最上层的函数,这个是不现实的。
但是也可以使用其他方法,比如全局变量之类的,每个函数都去判断这个全局变量,这样只要不满足,一层一层的退出函数,也可以实现这个功能,代码举例如下:
intflag=0;//全局变量,判断递归函数是否退出。
voidfun1()//递归函数实现
{
xxxx//其他语句
fun1();//递归调用
if(flag==1)//判断是否退出
{
return;
}
xxxx//其他语句
if(xxxx)//需要退出递归函数的条件
{
flag=1;//设置标志
return;//退出,这样会一直退出所有递归函数
}
}