c 递归算法(C语言中的递归是什么意思)

本文目录
- C语言中的递归是什么意思
- C语言递归算法
- C语言递归算法是怎么执行的
- 求汉诺塔C递归算法详细解答
- c语言函数递归的算法
- C语言如何用递归算法求1!+2!+3!+n!
- c语言,求递归算法的技巧最好有经典例子!
- C语言二叉树递归算法怎么做
- 在C语言中什么叫递归
- c语言 递归算法
C语言中的递归是什么意思
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
扩展资料:
递归的应用
1、数据的定义是按递归定义的。(Fibonacci函数)
2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
3、数据的结构形式是按递归定义的。
递归的缺点
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
参考资料来源:百度百科-递归
C语言递归算法
递归具体用法其实就是让你把一个问题分解成很多个类似的情况,虽然你要解决这个问题非常难,莫名其妙,要你想几年,但是把他一直递归分解,就变成很好理解的单种情况,而你整个问题又是跟这个单种情况类似,把整个问题通过递归调用一层一层分解到最低级简单的那种情况,就是你所需要理解的了。
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
(引自谭浩强的C语言书里)
用递归法计算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n》1)
具体如下long ff(int n)
{
long f;
if(n《0) printf("n《0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",&n);
y=ff(n);
printf("%d!=%ld",n,y);
}
较难题:一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图5.4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
具体如下move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--》%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c--》%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,’a’,’b’,’c’);
}
从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4 时程序运行的结果为:
C语言递归算法是怎么执行的
递归就是自己调用自己,例如你写的 net()函数,函数自己调用自己。
它调用自己的时候,不管程序运行到了哪,见到自己直接跳转,进入到下一个自己中运行,直到不满足跳入下一个自己的条件时,运行完当前函数,然后回到前一个自己中,回到跳出位置,继续运行没有完事的部分,直到完成当前函数,然后回到上一个自己。。。。这样直到回到第一个自己,运行开始跳出时没有完成部分的程序。这就是递归;
求汉诺塔C递归算法详细解答
Hanoi塔问题, 算法分析如下,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
(1)将A上的n-1(等于1)个圆盘移到B上;
(2)再将A上的一个圆盘移到C上;
(3)最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A)将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B)将A上的一个圆盘移到C。
C)将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时, 移动的过程可分解为三个步骤:第一步 把A上的n-1个圆盘移到B上;第二步 把A上的一个圆盘移到C上;第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。
Hanoi塔问题中函数调用时系统所做工作
一个函数在运行期调用另一个函数时,在运行被调用函数之前,系统先完成3件事:
①将所有的实参、返回地址等信息传递给被调用函数保存。
②为被调用函数的局部变量分配存储区;
③将控制转移到被调用函数的入口。
从被调用函数返回调用函数前,系统也应完成3件事:
①保存被调用函数的结果;
②释放被调用函数的数据区;
③依照被调用函数保存的返回地址将控制转移到调用函数。
当有多个函数构成嵌套调用时,按照“后调用先返回”的原则(LIFO),上述函数之间的信息传递和控制转移必须通过“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就为其在栈顶分配一个存储区,每当从一个函数退出时,就释放其存储区,因此当前运行函数的数据区必在栈顶。堆栈特点:LIFO,除非转移或中断,堆栈内容的存或取表现出线性表列的性质。正是如此,程序不要求跟踪当前进入堆栈的真实单元,而只要用一个具有自动递增或自动递减功能的堆栈计数器,便可正确指出最后一次信息在堆栈中存放的地址。
一个递归函数的运行过程类型于多个函数的嵌套调用,只是调用函数和被调用函数是同一个函数。因此,和每次调用相关的一个重要的概念是递归函数运行的“层次”。假设调用该递归函数的主函数为第0层,则从主函数调用递归函数为进入第1层;从第i层递归调用本函数为进入下一层,即i+1层。反之,退出第i层递归应返回至上一层,即i-1层。为了保证递归函数正确执行,系统需设立一个“递归工作栈”,作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个“工作记录”,其中包括所有实参、所有局部变量以及上一层的返回地址。每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归,就从栈顶弹出一个工作记录,则当前执行层的工作记录必是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。
P.S.代码如您写的。
c语言函数递归的算法
这是一个递归调用fun(x)的算法。
首先会计算x=1时,因为x是int型,所以x/2==0,返回1,所以打印1.
然后再计算x=2时,这时返回x%2=0,所以打印0;
再计算x=4时,同样返回x%2=0,所以打印0;
最后计算x=8时,返回x%2=0,所以打印0。
所以屏幕输出的就显示1000 。
C语言如何用递归算法求1!+2!+3!+n!
#include《stdio.h》
float fun(int n)
{
if(n==1) return 1;//如果n=1则直接返回1
return n*fun(n-1);//否则返回n*fun(n-1),以此计算n的阶乘,这条语句就是递归体
}
void main()
{
int i;
float sum=0;
for(i=1;i《=n;i++){
sum+=fun(i); //循环调用,用sum累计
}
printf("sum=%.2f\n",sum);
}
c语言,求递归算法的技巧最好有经典例子!
c语言中递归的最经典应用是求两个数的最小公约数,代码如下:
int MinDivisor( int m, int n)
{
if(m%n==0)
return n;
else
return MinDivisor(n, m%n);
}
C语言二叉树递归算法怎么做
#include 《stdio.h》
#include 《string.h》
struct treenode{
int value;
treenode* left;
treenode* right;
};
typedef treenode* BiTree;
void visit(treenode* node)
{
printf("%2d ", node-》value);
}
// 结点总数
int node(BiTree T)
{
if( !T ){
return 0;
}
return node(T-》left) + node(T-》right) + 1;
}
// 前序
void preOrder(BiTree T)
{
if( T ){
visit(T);
preOrder(T-》left);
preOrder(T-》right);
}
}
// 中序
void inOrder(BiTree T)
{
if( T ){
inOrder(T-》left);
visit(T);
inOrder(T-》right);
}
}
// 后序
void postOrder(BiTree T)
{
if( T ){
postOrder(T-》left);
postOrder(T-》right);
visit(T);
}
}
// 叶子节点数
int leafnode(BiTree T)
{
if( T ){
if( !T-》left && !T-》right )
return 1;
else
leafnode(T-》left) + leafnode(T-》right);
}else{
return 0;
}
}
int height(BiTree T)
{
if( T ){
int lh = height(T-》left);
int rh = height(T-》right);
return (lh》rh ? lh:rh) + 1;
}else{
return 0;
}
}
int main()
{
return 0;
}
在C语言中什么叫递归
递归:就是自己调自己,但是没终止条件会死循环,所以你的递归代码里有结束自调自的条件,这样就创造了有限次的循环(代码中你看不到for或foreach但是有循环发生)
就是一样了送回来了
在一个函数里存在函数本身,这样只要没达到要求,就会一直调用函数本身,这个就是递归函数的意思。
c语言 递归算法
1 你得到 的代码,就应该知道fac的作用
2 是结束递归条件
3、是结束时终值float fac(int n) //递归函数
{
float f; //设一返回变量
if(n《0) printf("n《0,error!"); //如初始输入小于0,显示错误,否则此句不会运行。
else if(n==0||n==1) //当阶乘递减到1或0时,每次递归该返回结果了。
f=1; //这是本身调用真正返回的第一个值。
else f=fac(n-1)*n; //循环递归调用
return(f); //返回值。
}

本文相关文章:
八戒八戒在线视频免费观看3(八戒八戒八戒八戒猴哥等等我歌词是什么意思)
2025年11月12日 21:30
shut是什么意思?shut是什么意思 英文shut是什么意思
2025年11月7日 06:15
更多文章:
新版6 电视剧(2019年最火的6部电视剧,你最爱看哪一部呢)
2026年11月2日 11:10
中国建设银行企业网上银行登录(中国建设银行网上银行企业怎么登录)
2025年6月13日 08:40
俄罗斯石油价格(俄罗斯石油实行每桶60美元上限美财长称未决定)
2025年11月29日 21:30
死神vs火影900人物版(跪求死神VS火影0.8全部人物出招表)
2025年11月5日 15:00
mimimi动漫网(mimimisollasol是什么歌曲)
2025年8月2日 05:15
在线听书吧网站升级无法看?听书吧有声小说网 这个网站这么下载 谁能告诉我一下 是用迅雷下载不
2025年8月12日 01:00
2023霸气头像(2022年女生头像霸气,2021年霸气女生头像)
2026年3月27日 05:00
三国塔防怎么配置随从?要个IPHONE上的三国塔防 蜀传 魏传 吴传无所谓 注:我要的PC版的
2025年7月6日 03:30












