阅读下列递归算法,写出非递归方法实现相同功能的c程序?

更多“将一个递归算法改为对应的非递归算法时,通常需要使用______。A.栈B.队列C.循环队列D.优先队列”相关的问题

一般情况下,将递归算法转换成等价的非递归算法应该设置( )

将递归算法转换成对应的非递归算法时,除了单向递归和尾递归的情况外,通常需要使用()保存中间结果。

请帮忙给出正确答案和分析,谢谢!

将递归算法转换成等价的非递归算法,一定要借助栈。()

此题为判断题(对,错)。请帮忙给出正确答案和分析,谢谢!

试将下列递归过程改写为非递归过程。

请帮忙给出正确答案和分析,谢谢!

在实现快速排序的非递归算法时,可根据基准元素.将待排序排序码序列划分为两个子序列。若下一趟首先对较短的子序列进行排序,试编写相应的算法,并说明在此做法下,快速排序所需要的栈的深度为O(log2n),

请帮忙给出正确答案和分析,谢谢!

设ha和hb分别是两个带附加头结点的非递减有序单链表的表头指针,试设计一个算法,将这两个有序链表合并成一个非递增有序的单链表,要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间,表中允许有重复的数据。

请帮忙给出正确答案和分析,谢谢!

给定三个n×n矩阵A、B和C,下面的偏假1/2正确的蒙特卡罗算法用于判定AB=C.算法所需的计算时间为Q

给定三个n×n矩阵A、B和C,下面的偏假1/2正确的蒙特卡罗算法用于判定AB=C.
算法所需的计算时间为Q(n2).显然当AB=C时,算法Product(A,B,C,n)返回true.试证明当AB≠C时,算法返回值为false的概率至少为1/2(考虑矩阵AB-C并证明当AB≠C时,将该矩阵各行相加或相减最终得到的行向量至少有一半是非零向量).

请帮忙给出正确答案和分析,谢谢!

两个正整数的最大公约数(Greatest Common Divisor,GCD) 是能够整除这两个整数的最大整数,请分别采用如下3种方法编写计算最大公约数的函数Ged(),在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大公约数。
(1)穷举法 ,由于a阳的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它,因此,先找到,a和b中中的较小者t,然后从t开始逐次减I尝试每种可能.即检验t到I之间的所有整数,第一个满足公约数条件的t就是和b的最大公约数。
(2)欧几里得算法,也称辗转相除法、对正整数a和b,连续进行求余运算,直到余数为0为止.此时非0的除数就是最大公约数。设r=a mod b表示a除以上的余数,若r≠0将b作为新的a,r作为新的b,即Ged(a,b)=Ged(b,r),重复a mod b运算,直到r=0为止,此时b为所求的最大公约数。例如,50和15的最大公约数的求解过程可表示为:Ged(50,15)=Ged(15,5)=Ged(5,0) =5。
(3)递归方法。对正整数a和b,当a>b时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的如下3条性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。
性质3如果a=b, 则a和b的最大公约数与a值和b值相同, 即Ged(a,b)=a=b

请帮忙给出正确答案和分析,谢谢!

设一棵二义树的存储表示是二叉链表、编写一个用Robson方法实现二叉树后序遍历的算法。Robson方法遍历二叉树的特点如下:
(1)沿袭5-60题使用逆转链遍历二叉树的思想。
(2)不使用tag标志,而是用内嵌的栈代替tag的作用。该内嵌的栈使用了叶结点作为栈的结构,没有另外定义栈的存储空间。
(3)利用栈解决在回溯时分辨究竟是从左子树还是右子树上升的问题,步骤是:
①当进入有非空左子树的结点的右子树时,将该结点的地址进栈。
②在回溯过程中如遇到结点的左、布子树都非空时,如果该结点就是存于栈顶的结点,则可判定当前是从该结点的右子树退回,该结点的右子女指针指向它的父结点;否则当前是从该结点的左子树退回,该结点的左子女指向它的父结点。

请帮忙给出正确答案和分析,谢谢!

对任何非零偶数n,总可以找到奇数m和正整数k,使得n=m2k.为了求出两个n阶矩阵的乘积,可以把一个n阶矩阵分成m×m个子矩阵,每个子矩阵有2k×2k个元素.当需要求2k×2k的子矩阵的积时,使用Strassen算法.设计一个传统方法与Strassen算法相结合的矩阵相乘算法,对任何偶数n,都可以求出两个n阶矩阵的乘积.并分析算法的计算时间复杂性.

请帮忙给出正确答案和分析,谢谢!

}

当前问题执行到一个状态,以现有的条件无法完全解决时,必须先记下当前状态,然后继续往下执行,等条件成熟后再返回解决。
如DFS时,当前节点1,沿着邻接点2往下遍历,后面还要回到节点1继续遍历其他邻接点。

最近做题遇到过几次递归实现的算法,要求你用非递归的方式实现。这里做一个总结。其实也没技巧,再看几遍,多默写几次代码,记熟即可。
递归算法基本都涉及到函数调用栈。每次递归调用时都将函数数据入栈,所以递归调用越深,占用的栈空间越多。如果层数过深,肯定会导致栈溢出,这也是消除递归的必要性之一。

用循环结构代替单向递归和尾递归。

单向递归:简单的说是指递归的过程总是朝着一个方向进行。函数1调用函数2再调用函数3…一只不重复调用之前的函数。
尾递归函数是以递归调用结尾的函数,是单向递归的特例。

尾递归的递归调用语句只有一个,而且是放在过程的最后。当递归调用结束并返回时,上层函数也就结束了。无需关注函数地址、参数、局部变量等,因此可以直接采用循环写出非递归过程。

如何由递归转循环呢,我的思路是列出递归每次的值,然后找规律:

0 0
0
0、1的时候直接是n,因此循环从2开始,x1初始为0,x2初始为1;依次递增到n(n>=2)结束,执行n-1次

再观测,x2等于上一次相加的x1,x1等于上一次相加的sum。则循环体内为:

直接用循环替代递归不是很难,一般找清楚递归的变化规律就可以做出。

用于需要回溯的递归;如:函数1调用函数2,函数2又要回溯到函数1;再由函数1调用函数3;(想象树的遍历)我们可以根据函数调用栈,手动建立一个栈,实现非递归实现。

注意一点就是:先读取栈顶元素,找到栈顶元素满足条件的下一个元素入栈。因为此时该元素没有出栈+循环的缘故,上层栈内元素出栈后,会回溯到该元素,直到该元素所有满足条件的元素都被访问,该元素出栈,就不会被回溯。这就模拟了函数的递归调用栈。
在数据结构中递归间接转换非递归应该有很多,不够我目前遇到的主要还是二叉树遍历和图的深度遍历,下面做一个记录:

观察先序遍历的入栈过程:
根节点左子树各节点入栈并访问,各节点出栈
根节点右子树各节点入栈并访问,各节点出栈

-----栈顶元素出栈,访问;
-----栈顶元素右孩子入栈;左孩子入栈;

注意:真实递归的话是左子树先入栈,依次遍历并出栈后右子树才入栈。
我们这边模拟为了简化,是右孩子先入左孩子后入。以此实现先访问左孩子后访问右孩子。

节点入栈时,节点左孩子入栈;
直到节点左孩子不存在,节点出栈,节点右孩子入栈;

栈1中根右左顺序入栈2
栈2中即可实现逆序,左右根

访问v0;v0此时已在函数栈中
找v0的第一个为未访问的边;
找到就递归调用边指向的邻接点v1

访问邻接点v1;邻接点v1此时已在函数栈中
找v1的第一个为未访问的边;
找到就递归调用边指向的邻接点v2
没有找到就结束递归,v2出栈

回溯访问v0;v0此时还在函数栈中
找v0的第一个为未访问的边;(此时指向v1的边已经访问了)
找到就递归调用边指向的邻接点v3

提取栈顶v0;找v0的第一个未访问的边;
找到了;访问边指向的邻接点v1并入栈


新开通了本人的公众号,欢迎关注:燕南路GISer ,专注GIS干货分享,不定期更新。
主要兴趣:GIS、时空数据挖掘、python、机器学习深度学习
提问、求资源等都可在公众号后台留言
CSDN的部分内容会重写再搬迁到公众号,欢迎关注!

}

我要回帖

更多关于 折半查找非递归 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信