2 aaawei1996 AAAwei1996 于 2017.01.15 23:04 提问

递归过程到底是如何进行的

哪位大神能给我完整的讲一下递归调用是如何进行的么?递归的核心思想是什么,他的算法应该如何去写,递归算法的一般格式是什么?谢谢啦

7个回答

yh1276
yh1276   2017.01.16 09:34

我学递归就想到了李小龙的死亡之塔,先一层一层的打下去,当打到最后一层即是到了地底,然后再往回走干正事。

caozhy
caozhy   Ds   Rxr 2017.01.15 23:35
 递归的核心思想是自己调用自己,它的哲学思想是一个事物的局部和整体具有同构性。它的数学思想是,用数学归纳法或者递推的方式描述和解决问题。另外“一个循环,和一个递归的作用是一样的”这个观点片面了。循环必然可以用递归表示,但是递归不一定可以表示循环。

“一个事物的局部和整体具有同构性”,在遍历treeview或者文件系统中体现得很清楚,一个文件夹,它本身可以包含子文件夹或者文件,这是它的内部结构。而文件夹相对于父文件夹,它又是一个大的结构的一部分。
再比如快速排序算法,对数据排序的一种方式是,首先将数据划分成相比较某个特定值小的和大的两堆,全部小的排在前面,全部大的排在后面。对于小的那堆和大的那堆本身,又可以用相同的方式划分成更小的堆。如果每个堆都只有一个数据了,那么构成的排列就是有序的。

至于数学归纳,比如费波拉契数列,就是一个例子,费波拉契数列在数学上用数学归纳法表示为,对于一个数列,第一个和第二个数是1,其余的数,它的值等于它前两项值的和,即f(x) = 1 ... x = 1, 2 f(x) = f(x - 2) + f(x - 1) x > 2

qq_25796431
qq_25796431   2017.01.16 08:53

1.首先要明白你写这个算法是做什么的。
2.算法结束是什么时候
3.相信你写的能完成这个任务。
比如递归求和
int add(n){
if n==1 return 1;
else return n+add(n-1);
}

sycdzdd
sycdzdd   2017.01.16 09:44

1、递归就是调用自身,在减少问题规模后,例如二分查找,分成两半再去查找;2、递归调用需要有出口,也就是在问题规模最小时结果是什么,然后结果不停返回参与上层计算,最终得到最外围调用计算的结果

a15129095654
a15129095654   2017.01.15 23:15

递归不就是在运行过程中调用自己。比如说要求n!,你就可以使用递归
int factorial(int n) {
if (n != 0) {
n = n * factorial(n-1);
}
else {
return n;
}
}

a15129095654
a15129095654 不对,是n != 1
一年多之前 回复
qq_29594393
qq_29594393   Ds   Rxr 2017.01.15 23:22

递归和普通的函数调用没有任何区别,只不过是调用函数本身 。递归的核心思想是 不确定的多个任务分解为相同的小任务。
其实就是遍历 。和穷举 的一种实现。
例如遍历一个文件夹 下面的所有文件 ,分类不过就是两种 ,文件夹下面就两种情况,一是文件 ,二是文件夹 。如果是文件夹的话继续实现上述方法,就能做到递归。几行代码,就能遍历文件夹所有的文件
再例如累加 ,阶乘
int add(int n){
if(n>0){
return add(n-1)+n
}
return 0;

}
你会发现,一个循环,和一个递归的作用是一样的,不过递归可以无线层级。而循环只是第一层

Z_yichen
Z_yichen   2017.01.15 23:35

问题一:递归是一个函数自身调用自身.
问题二:首先它没有固定的格式,本质是自己调用自身:
为什么要用递归:例:f(l,r)表示一个函数求和在数组区间[l,r];那么它的结果就等于f(l,mid) + f(mid +1,r)对不对;
但是f(l,mid)是不是本质也是f函数只不过是参数改了,也就是说我们在f(l,r)函数的内部分开称两个函数,f(l,mid),f(mid+1,r)则它会先执行这两个函数,算出它们的结果,那么我们的f(l,r)函数是不是结果就出来了,那么f(l,mid)怎么算呢,是不是同理,知道l == mid那么就对应哪一个数组元素了.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于递归实现过程的详解
最近在学数据结构的时候,碰到了递归,但由于自己一直对递归一知半解,所以不能全面的理解递归的过程到底是怎样实现的,下来研究了一下,觉得还是有所收获的。  假设我们用递归实现一个数的阶乘。int fun(int n) { if(n == 0) return 1; else return n*fun(n-1); }这里递归调用的过程为: 递归调用 其实就是函数的调用而已,只不过这
DNS原理总结及其解析过程详解(递归查询+迭代查询)
一、域名系统 1、域名系统概述         域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中。        
函数调用过程中栈到底是怎么压入和弹出的?
http://www.zhihu.com/question/22444939 一个程序在运行过程中,一个函数会调用另一个函数(比如递归),那么函数在进入的时候都会往栈里压点什么东西,函数退出时会弹出点什么东西,内层的函数是如何返回的,返回给外层函数的谁,返回到哪里,内层函数是怎么知道返回地址的?
递归函数的调用过程和方法
今天我们和大家一起来学习一下递归函数的调用过程和方法,下面是个关于递归调用简单但是很能说明问题的例子: /*递归例子*/ #include void up_and_down(int); int main(void) {    up_and_down(1);    return 0; } void up_and_down(int n) {   printf(/"Level %d:n lo
对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。
第三次上机—语法分析1 目的:熟练掌握自上而下的语法分析方法,并能用C++程序实现。 要求: 1. 使用的文法如下: E ® TE ¢ E ¢ ® + TE ¢ | e T ® FT ¢ T ¢ ® * FT ¢ | e F ® (E) | id 2. 对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。 3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。可以参考书上介绍的同步记号集合来处理。 可能的出错情况:idid*id, id**id, (id+id, +id*+id …… 4. 输入串以#结尾,输出推导过程中使用到的产生式。例如: 输入:id+id*id# 输出:E ® TE ¢ T ® FT ¢ F ® id E ¢ ® + TE ¢ T ® FT ¢ …… 如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。比如: idid*id对应的出错信息是:“输入串跳过记号id,用户多输入了一个id”; id**id对应的出错信息是:“弹栈,弹出非终结符F,用户少输入了一个id” (id+id对应的出错信息是:“弹栈,弹出终结符 ) ,用户少输入了一个右括号(或者说,括号不匹配)” 有余力的同学可进一步考虑如下扩展: 1. 将递归下降方法和非递归预测分析方法都实现 2. 在语法分析的过程中调用第二次上机的结果,即利用词法分析器来返回一个记号给语法分析器。 3. 编写First和Follow函数,实现其求解过程。 测试文法: A->BCDE B->aBA|ε C->F|ε D->b|c|ε E->e|ε F->d|ε
浅析递归算法的运行原理
递归,即程序(函数)通过直接或者间接调用自己的一个过程。 递归算法主要有四个特点: 1. 必须有可达到的终止条件,不然程序(函数)将陷入死循环(死锁); 2. 子过程可通过再次递归的方式调用求解或因满足终止条件而直接求解; 3. 子过程在规模上比原过程要小(一般是折半),或更接近终止条件; 4. 所有子过程的解构成整个过程的解的集合。
递归下降分析源程序的程序
递归下降分析源程序,编译原理的入门第一个程序。
到底如何理解递归?
学习递归是从汉诺塔问题开始接触并展开的,但是从汉诺塔问题就无法理解透彻,书中介绍的以压栈弹栈的解决方法一步步演示汉诺塔问题,但是虽然图画的很细致基本上每一步骤都画出来了但是光是返还时的地址就搞晕了头,看了快十几遍都是到后来找错返还地址,然后上网查找资料尝试理解 假设前n-1次都已经完成了递归,再这最后一次完成递归 的思想,理解多多少少理解了,但是也是在看到代码的情况下才能大概 根据刚刚讲的想法强行
用栈实现Fibnacci递归过程的非递归算法
#include #include using namespace std; //模拟递归工作栈。 //data表示当前状态的参数值 //state表示当前栈的完成状态,state = 2 表示未计算, state = 1 表示计算了递归树左部,state = 0 表示计算了整个递归子树 struct stackNode { int data; int state; stackNode
深入理解递归函数的调用过程
下面是个关于递归调用简单但是很能说明问题的例子:/*递归例子*/#includevoid up_and_down(int);int main(void){   up_and_down(1);   return 0;}void up_and_down(int n){  printf("Level %d:n location %p/n",n,&n); /* 1 */  if(n  up_an