您当前的位置:首页 > 生活常识 > 正文

递归是什么意思(什么叫递归法)

本文目录

  • 什么叫递归法
  • 递归函数是什么意思
  • 什么是递归算法
  • 算法设计的基本方法里面的“递归”是什么意思
  • 什么是递归函数 怎样实现递归
  • “递归”和“迭代”有什么区别
  • 谁能给我举个例子解释下递归是什么意思
  • 在C语言中什么叫递归

什么叫递归法

1、递归算法概念:在函数或子过程的内部,直接或者间接地调用自己的算法。2、基本信息:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数或过程来表示问题的解。一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或函数。

递归函数是什么意思

说的太多反而不清楚是什么回答问题最好不要复制粘贴。。。递归就是一个函数内出现调用本身的现象,举个最简单的例子,求阶乘:当n=0或1时,n!=1;当n》1时,n!=n*(n-1)!通过这样的思想,程序写为:intfun(intn){if(n《2)return1;elsereturnn*fun(n-1);}看到了fun函数内调用了它本身fun,可以想象一步步下去就可以得到计算结果。

什么是递归算法

递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销很大的算法。比如:汉诺塔的递归算法:void move(char x,char y){ printf(“%c--》%c\n“,x,y);}void hanoi(int n,char one,char two,char three){/*将n个盘从one座借助two座,移到three座*/ if(n==1) move(one,three); else{ hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}main(){ int n; printf(“input the number of diskes:“); scanf(“%d“,&n); printf(“The step to moving %3d diskes:\n“,n); hanoi(n,’A’,’B’,’C’);}我说下递归的理解方法首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的首先按我上面说的把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的问题是要将m个的“汉诺块“由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧?所以,mian函数里面有hanoi(m,’A’,’C’,’B’);这个调用。接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么?在hannoi函数里有这么三行 hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢?这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hannoi函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢?很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n》=1时将n个块由A经由B搬到C的完整功能了。递归这个复杂的思想就是这样简单解决的,呵呵 不知道你看懂没?纯手打,希望能帮你理解递归总结起来就是不要管递归的具体实现细节步骤,只要知道他的功能是什么,然后利用他自己的功能通过调用他自己去解决自己的功能(好绕口啊,日)最后加上一个极限情况的条件即可,比如上面说的1个的情况。

算法设计的基本方法里面的“递归”是什么意思

递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象.递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能使程序变得简洁和清晰.。 递归是一种重要的编程技术。该方法用于让一个函数从其内部调用其自身。一个示例就是计算阶乘。0 的阶乘被特别地定义为 1。 更大数的阶乘是通过计算 1 * 2 * ...来求得的,每次增加 1,直至达到要计算其阶乘的那个数。下面的段落是用文字定义的计算阶乘的一个函数。“如果这个数小于零,则拒绝接收。如果不是一个整数,则将其向下舍入为相邻的整数。如果这个数为 0,则其阶乘为 1。如果这个数大于 0,则将其与相邻较小的数的阶乘相乘。”要计算任何大于 0 的数的阶乘,至少需要计算一个其他数的阶乘。用来实现这个功能的函数就是已经位于其中的函数;该函数在执行当前的这个数之前,必须调用它本身来计算相邻的较小数的阶乘。这就是一个递归示例。递归和迭代(循环)是密切相关的 — 能用递归处理的算法也都可以采用迭代,反之亦然。确定的算法通常可以用几种方法实现,您只需选择最自然贴切的方法,或者您觉得用起来最轻松的一种即可。显然,这样有可能会出现问题。可以很容易地创建一个递归函数,但该函数不能得到一个确定的结果,并且不能达到一个终点。这样的递归将导致计算机执行一个“无限”循环。下面就是一个示例:在计算阶乘的文字描述中遗漏了第一条规则(对负数的处理) ,并试图计算任何负数的阶乘。这将导致失败,因为按顺序计算 -24 的阶乘时,首先不得不计算 -25 的阶乘;然而这样又不得不计算 -26 的阶乘;如此继续。很明显,这样永远也不会到达一个终止点。因此在设计递归函数时应特别仔细。如果怀疑其中存在着无限递归的可能,则可以让该函数记录它调用自身的次数。如果该函数调用自身的次数太多,即使您已决定了它应调用多少次,就自动退出。下面仍然是阶乘函数,这次是用 JScript 代码编写的。 // 计算阶乘的函数。如果传递了// 无效的数值(例如小于零),// 将返回 -1,表明发生了错误。若数值有效,// 把数值转换为最相近的整数,并// 返回阶乘。function factorial(aNumber) {aNumber = Math.floor(aNumber); // 如果这个数不是一个整数,则向下舍入。if (aNumber 《 0) { // 如果这个数小于 0,拒绝接收。 return -1; } if (aNumber == 0) { // 如果为 0,则其阶乘为 1。 return 1; } else return (aNumber * factorial(aNumber - 1)); // 否则,递归直至完成。}

什么是递归函数 怎样实现递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 

当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 

所以递归要有两个要素,结束条件与递推关系。

递归有两个基本要素:

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果 

在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;

(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;

(3)每次递归调用结束后,将栈顶元

扩展资料:

递归就是某个函数直接或间接地调用了自身,这种调用方式叫做递归调用。说白了,还是函数调用。既然是函数调用,那么就有一个雷打不动的原则:所有被调用的函数都将创建一个副本,各自为调用者服务,而不受其他函数的影响。

你的ff函数,递归多少次,就有多少个副本,再利用内存的栈式管理,反向退出。这个最好找一下“栈”这方面的东西看看,挺容易的,就像子弹匣一样,先进后出。

从某种意义上说,这是不对的,因为就像刚才说的,一旦被调用,他将在内存中复制出一份代码,再被调用就再复制一份,换句话说,你可以吧同一个函数的多次调用理解称谓多个不同函数的一次调用,这样也会会简单些。

再说=1和=0是为什么退出。递归,很需要注意的就是死递归,也就是说,某一个函数进入了无限调用自身的情况,永无止境地消耗内存等资源,这在编程方面是一大忌。

但凡是递归的函数,一定会在某一个地方存在能够返回上一层函数的代码,否则必定死递归。ff函数中,那个else就是返回的出口,你可以这样想,如果没有那个if来进行判断,你递归到什么时候算完?ff是不是会一直调用自己。

因为一旦某个函数A中调用了函数B(或者自己),那么A中的代码会停在调用的位置,而转向B中去执行,同理,如果B又调用函数C,那么B又停在调用的位置,去执行C,如果无限调用,那么程序是永远不会结束的。

当然,也有这种情况,A调用B,然后继续自己的代码,不管B的死活,这种不在我们的讨论范围内,因为那牵扯到另一种编程方式:多线程。

参考资料:百度百科——递归函数

“递归”和“迭代”有什么区别

“递归”和“迭代”的区别如下:

1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。

2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。

3、递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。

谁能给我举个例子解释下递归是什么意思

首先来看一个例子:有一个Febonacci序列:它的问题是:求这个序列中的第N个数。由于它的函数原形是:f(N)=f(n-1)+f(n-2)这用递归很容易就可以写出代码来,一点都不费事:int Febc(int n) {if(n《3) return (1);elsereturn (Febc(n-1)+Febc(n-2));}噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n》3时,它显然只能求助于n-1,n-2。而(n-1)》2,(n-2)》2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)《3,(n-k-1)《3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中, if(n《3) return (1); 就是停止的条件。然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(N)函数10000多次!!!而上面一个例子用循环也是十分容易写的:/*using turboc2*/int febc(int);main(){int n;scanf(“%d“,&n);febc(N);}int febc(int n){int a,i;a=a=a=1;for(i=3;i《=n;i++)a[i%3]=a[(i+1)%3]+a[(i+2)%3]; /*实现 Febc(I)=Febc(i-1)+Febc(i-2)*/printf(“\n%d\n“,a[n%3]);}有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)现在我们再来看看一个求从1 加到100的循环:下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)/*using Turboc2*/int a=0;int account(int);main(){account(100);printf(“%d“,a);}int account(int i){if(i==1) return 1; /*停止条件*/elsereturn (n+f(n-1)); /*此句有问题*/}在C/C++的问题中,我曾经回答过这样的一个问题:先写出函数表达式:f(N)=f(n-1)+f(n-3)f(N)-f(n-1)=f(n-3)因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)#include《iostream.h》#include《conio.h》int cattle(int,int);void main(){int ct,n;cout《《“Please input the original cattle number:“《《endl; /*输入起始牛的数量*/cin》》ct;cout《《“Input how many years it past:“《《endl;cin》》n;cout《《“You have “《《cattle(ct,n)《《“ cattle now!“《《endl;getch();}int cattle(int ct,int n){if(n《4) return (ct); /*停止条件*/elsereturn (cattle(ct,n-1)+cattle(ct,n-3)); /*实现递归*/}怎么样,很简单吧。 会用循环求解吗?递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。

在C语言中什么叫递归

递归:就是自己调自己,但是没终止条件会死循环,所以你的递归代码里有结束自调自的条件,这样就创造了有限次的循环(代码中你看不到for或foreach但是有循环发生)


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 此地无银三百两下一句是什么(此地无银三百两下一句)

下一篇: python有什么用(Python能用来做什么)



推荐阅读