当前位置:首页 » 操作系统 » 递归算法的数据结构

递归算法的数据结构

发布时间: 2022-04-26 02:10:33

‘壹’ 在计算机内实现递归算法时所需的辅助数据结构是

这么想 一个函数递归调用自己 第一次调用叫M1 第二次M2 ……最后次叫Mn 调用的时候是M1->M2->M3……->Mn 但是执行是反过来的 Mn执行结束后 返回结果是作为Mn-1的一部分的 Mn-1执行完 返回给Mn-2 一层层递归上去至M1执行结束 这个递归才结束 这是什么 后进先出 !懂了么

‘贰’ 递归算法使用的数据结构是栈吗

a

这里的栈即是指堆栈,是一种先进后出的数据结构。系统实现递归时,本身也是用堆栈实现的,用来保存现场信息。

‘叁’ C语言递归问题,数据结构基础

数组下标从0到i-1,共i个数,当然是乘以i了。注意下标从0开始,而不是从1开始。

‘肆’ 实现递归算法所需的数据结构是什么

堆栈,为了保存函数入口和上下文。

‘伍’ 数据结构是一种递归算法吗

数据结构就是数据结构;

递归算法是算法的一种。

两者不能说风马牛不相及。但相提并论似乎不妥!

‘陆’ 写一个递归算法(数据结构)

简单,实现用结构数组,三个成员域, 变量名,表达式, 默认值,当然这个检索比较麻烦,我不能用变量名"A"直接找到,对应的其他值(必须要循环数组),用C#的的字典对象就好办了<index,value>,这个不是关键
下面 写个函数 叫 defaulvalue cal( 变量名) {
if 变量名.默认值<> null 则 cal (计算公式); -- 递归开始,计算公式要进行解析,按单独变量来,还要解析运算符(有点复杂,如果涉及到运算符的优先判断,这里的都是平级的,还有进行运算符优先判断)
else reture 默认值 --递归终结
}
基本就这样,有点简单,还要仔细斟酌下

‘柒’ 在递归算法执行过程中,计算机系统必定会用到的数据结构是

指针

因为递归调用必然会用到函数指针对同一函数体进行反复的调用。

‘捌’ 数据结构中的递归算法问题

全排列问题是没办法优化的!
你生成了全排列总得输出(存储)吧?这至少要1个单位时间吧?而n个数的全排列有n!个吧?那至少要n!的时间吧?
恰恰你递归+for的次数也是n!次。所以最多也只是在时间上乘以2而已。何况存储用的时间远高于运算用的时间。输出就更费时了。

‘玖’ C语言递归算法

本人学c++,c的语法已经淡忘了,但是递归不管什么语言都是一个原理
其实简单一点来说就像数学里面的数列的通项公式:
例如一个数列是2,4,6,8,10......
很容易就可以得到通项公式是a[n]=2*n n是大于0的整数
你肯定学过这个数列的另外一种表示方式就是: a[1]=2, a[n]=a[n-1]+2 n是大于1的整数
其实这就是一个递归的形式,只要你知道初始项的值,未知项和前几项之间的关系就可以知道整个数列。
程序例子:比如你要得到第x项的值
普通循环:
for(int i=1; i<=n; i++)
if (i == x)
cout << 2*i; /*cout 相当于 c里面的printf,就是输出.*/
递归:
int a(int x) {
if (x = 1)
return 2; /* 第一项那肯定是2了,这个也是递归的终止条件! */
else return a(x-1)+2; /* 函数自身调用自身是递归的一个特色 */
比如x=4,那么用数学表示就是a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2
其实递归方法最接近自然,也是最好思考的一个方法,难点就是把对象建模成递归形式,但是好多问题本身就是以递归形式出现的。
普通递归就是数据结构上的堆栈,先进后出。
例如上面x=4,把a(4)放入栈底,然后放入a(3),然后a(2),a(1),a(1)的值已知,出栈,a(1)=2,a(2)出栈a(2)=a(1)+2=2+2=4,a(3)出栈a(3)=a(2)+2=(a(1)+2)+2=6,a(4)出栈a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2=8
再比如楼上的阶乘例子,当n=0 或 1时,0!=1,1!=1,这个是阶乘的初始值,也是递归的终止条件。然后我们知道n!=n*(n-1)!,当n>1时,这样我们又有了递归形式,又可以以递归算法设计程序了。(楼上已给出谭老的程序,我就不写了)。
我给出一种优化的递归算法---尾递归。
从我给出的第一算法可以看出,先进栈再出栈,递归的效率是很低的。速度上完全比不上迭代(循环)。但是尾递归引入了一个新的函数参数,用这个新的函数参数来记录中间值.
普通递归阶乘fac(x),就1个x而已,尾递归用2个参数fac(x,y),y存放阶乘值。
所以谭老的程序就变成
// zysable's tail recursive algorithm of factorial.
int fac(int x, int y) {
if (x == 1)
return y;
else return fac(x-1, y*x);}
int ff(int x) {
if (x == 0)
return 1;
else return fac(x,1);}
对于这个程序我们先看函数ff,函数ff其实是对fac的一个封装函数,纯粹是为了输入方便设计的,通过调用ff(x)来调用fac(x,1),这里常数1就是当x=1的时候阶乘值了,我通过走一遍当x=3时的值即为3!来说明一下。
首先ff(3),x!=0,执行fac(3,1).第一次调用fac,x=3,y=1,x!=1,调用fac(x-1,y*x),新的x=2,y=3*1=3,这里可以看到,y已经累计了一次阶乘值了,然后x还是!=1,继续第三次调用fac(x-1,y*x),新的x=1,y=2*3=6,然后x=1了,返回y的值是6,也就是3!.你会发现这个递归更类似于迭代了。事实上我们用了y记录了普通递归时候,出栈的乘积,所以减少了出栈后的步骤,而且现在世界上很多程序员都在倡议用尾递归取消循环,因为有些在很多解释器上尾递归比迭代稍微效率一点.
基本所有普通递归的问题都可以用尾递归来解决。
一个问题以递归来解决重要的是你能抽象出问题的递归公式,只要递归公式有了,你就可以放心大胆的在程序中使用,另外一个重点就是递归的终止条件;
其实这个终止条件也是包含在递归公式里面的,就是初始值的定义。英文叫define initial value. 用普通递归的时候不要刻意让自己去人工追踪程序,查看运行过程,有些时候你会发现你越看越不明白,只要递归公式转化成程序语言正确了,结果必然是正确的。学递归的初学者总是想用追踪程序运行来让自己来了解递归,结果越弄越糊涂。
如果想很清楚的了解递归,有种计算机语言叫scheme,完全递归的语言,因为没有循环语句和赋值语句。但是国内人知道的很少,大部分知道是的lisp。
好了,就给你说到这里了,希望你能学好递归。

PS:递归不要滥用,否则程序极其无效率,要用也用尾递归。by 一名在美国的中国程序员zysable。

‘拾’ 在数据结构的算法中,1什么是递归,2如何设计递归算法

一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。给你一个示例做1+2+3+。。。+n
int digui(int n)
{ int t;
if(n>1)
{t=digui(n-1)+n;
return t;}
else
return 1;
}

热点内容
密码本子的密码一般都是什么 发布:2024-10-03 14:29:11 浏览:745
易语言网络验证源码 发布:2024-10-03 14:24:53 浏览:365
平板电脑安卓444很卡怎么办 发布:2024-10-03 14:20:31 浏览:604
如何查安卓app最初发布时间 发布:2024-10-03 14:20:31 浏览:562
安卓如何进文件夹 发布:2024-10-03 14:19:55 浏览:801
c语言年份 发布:2024-10-03 13:42:03 浏览:569
电视尺寸算法 发布:2024-10-03 13:30:58 浏览:65
内网自己搭建服务器 发布:2024-10-03 13:13:31 浏览:669
云存储看不清 发布:2024-10-03 13:06:20 浏览:220
hld编程 发布:2024-10-03 13:03:18 浏览:179