如何解决批量数码之家注册验证问题问题

> 把一个递归程序转化成循环代码如下,请大神帮忙,十分感谢deffun(a,b,c,n,r=[]):i
把一个递归程序转化成循环代码如下,请大神帮忙,十分感谢deffun(a,b,c,n,r=[]):i
longshuang & &
发布时间: & &
浏览:64 & &
回复:3 & &
悬赏:0.0希赛币
把一个递归程序转化成循环代码如下,请大神帮忙,十分感谢!
  def&fun(a,b,c,n,&r=[]):
r.append([[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]])
#print&[[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]]
fun(a/2.0,&b,&c,n-1)
fun(a/2.0,&b+a/4.0,&c-a/2.0,&n-1)
fun(a/2.0,&b+a/2.0,&c,&n-1)
print&fun(-1,&0.5,&0,&2)
用列表保存参数,模仿函数出入栈的动作...
  def&fun_nr(a,&b,&c,&n):
&&&&s&=&[(a,&b,&c,&n)]
&&&&r&=&[]
&&&&while&s:
&&&&&&&&a,&b,&c,&n&=&s.pop()
&&&&&&&&if&n&$<$1:
&&&&&&&&&&&&r.append([[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]])
&&&&&&&&else:&&&&&&&&&&&&
&&&&&&&&&&&&s.append((a/2.0,&b+a/2.0,&c,&n-1))
&&&&&&&&&&&&s.append((a/2.0,&b+a/4.0,&c-a/2.0,&n-1))
&&&&&&&&&&&&s.append((a/2.0,&b,&c,n-1))
&&&&return&rtanbh & &
11:52:49 & &
& & (0)(0)递归层次若在控制下,就不用强迫改成循环...参数r=[]这个用可变的不好,你print&fun(-1,&0.5,&0,&2)两下试试,默然参数应该是方便最外层调用(面对其他用户),自己写的部分把参数带上,或者既然函数有返回r值,就不需要重复带参数。类似:
  def&fun(a,b,c,n):
&&&&if&n&1:
&&&&&&&&return&[[[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]]]
&&&&&&&&#print&[[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]]
&&&&&&&&r&=&[]
&&&&&&&&r&+=&fun(a/2.0,&b,&c,n-1)
&&&&&&&&r&+=&fun(a/2.0,&b+a/4.0,&c-a/2.0,&n-1)
&&&&&&&&r&+=&fun(a/2.0,&b+a/2.0,&c,&n-1)
&&&&return&r
tanbaogang & &
11:52:49 & &
& & (0)(0)写了个不简洁的,应该还能优化
  def&f(ls):
&&&&a,b,c=ls
&&&&return&[[a/2.0,&b,&c],&[a/2.0,&b+a/4.0,&c-a/2.0],&[a/2.0,&b+a/2.0,&c]]
def&g(ls):
&&&&a,b,c=ls
&&&&return&[[b,&c],&[b&+&a/2,&c&-&a],&[b&+&a,&c]]
def&fun(a,b,c,n):
&&&&t=[[a,b,c]]
&&&&for&i&in&range(n):
&&&&&&&&t=[y&for&x&in&map(f,&t)&for&y&in&x]tanbaogang & &
11:52:49 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&5052人阅读
Algorithm(19)
转载(85)
循环(迭代)与递归的区别
1。递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法。
当然,从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样。这也是为什么在结构设计时,通常采用递归的方式而不是采用迭代的方式的原因,一个极典型的例子类&#20284;于链表,使用递归定义及其简单,但对于内存定义(数组方式)其定义及调用处理说明就变得很晦涩,尤其是在遇到环链、图、网&#26684;等问题时,使用迭代方式从描述到实现上都变得很不现实。
2。递归其实是方便了程序员难为了机器。它只要得到数学公式就能很方便的写出程序。优点就是易理解,容易编程。但递归是用栈机制实现的(c&#43;&#43;),每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。
循环其缺点就是不容易理解,编写复杂问题时困难。优点是效率高。运行时间只因循环次数增加而增加,没什么额外开销。空间上没有什么增加。
3。局部变量占用的内存是一次性的,也就是O(1)的空间复杂度,而对于递归(不考虑尾递归优化的情况),每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。
4。递归程序改用循环实现的话,一般都是要自己维护一个栈的,以便状态的回溯。如果某个递归程序改用循环的时候根本就不需要维护栈,那其实这个递归程序这样写只是意义明显一些,不一定要写成递归形式。但很多递归程序就是为了利用函数自身在系统栈上的auto变量记录状态,以便回溯。
原理上讲,所有递归都是可以消除的,代价就是可能自己要维护一个栈。而且我个人认为,很多情况下用递归还是必要的,它往往能把复杂问题分解成更为简单的步骤,而且很能反映问题的本质。
首先,递归和递推又一定的相&#20284;性(当然了,不然怎么会提出这个问题?)
这两个问题都可以描述为以下形式:
f(n)=g(f(n-1),…,f(0))
这是二者的共同特点。
1,从程序上看,递归表现为自己调用自己,递推则没有这样的形式。
2,递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,最终求得问题
是逆向的。递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。
3,递归中,问题的n要求是计算之前就知道的,而递推可以在计算中确定,不要求计算前就知道n。
4,一般来说,递推的效率高于递归(当然是递推可以计算的情况下)
由于一切递归问题都可以转化为循环求解,因此我们可以定义广义递归:
如果转化为循环后,需要自己维护堆栈,则仍称为是递归的。
在这个定义下,有些问题适用于用递归求解,如梵塔问题有些问题适用于用递推来做,如求满足N!&M条件时最小的N。有些问题二者都可以,如给定N时的阶乘问题。至于可读性,与问题有关,不能一概而论。
递归其实就是利用系统堆栈,实现函数自身调用,或者是相互调用的过程。在通往边界的过程中,都会把单步地址保存下来,知道等出边界,再按照先进后出的进行运算,这正如我们装木桶一样,每一次都只能把东西方在最上面,而取得时候,先放进取的反而最后取出。递归的数据传送也类&#20284;。但是递归不能无限的进行下去,必须在一定条件下停止自身调用,因此它的边界&#20540;应是明确的。就向我们装木桶一样,我们不能总是无限制的往里装,必须在一定的时候把东取出来。比较简单的递归过程是阶乘函数,你可以去看一下。但是递归的运算方法,往往决定了它的效率很低,因为数据要不断的进栈出栈。这时递推便表现出它的作用了,所谓递推,就是免除了数据进出栈的过程。也就是说,不需要函数不断的向边界&#20540;靠拢,而直接从边界出发,直到求出函数&#20540;。比如,阶乘函数中,递归的数据流动过程如下:
f(3){f(i)=f(i-1)*i}--&f(2)--&f(1)--&f(0){f(0)=1}--&f(1)--&f(2)--f(3){f(3)=6}
而递推如下:
f(0)--&f(1)--&f(2)--&f(3)
由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推。但是递归作为比较基础的算法,它的作用不能忽视。所以,在把握这两种算法的时候应该特别注意。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:274418次
积分:3638
积分:3638
排名:第7748名
原创:73篇
转载:105篇
评论:69条
本博客是SHIZHIXIN的技术博客,其中标注为原创的文章属于个人原创,如理解有误,欢迎交流指正,转载请标明出处。标注为转的文章我尽量表明出处,如有不妥或者实难查证之处,敬请谅解或者来信告知,我尽快修改。所有文章仅学习交流之用。如有问题,欢迎联系QQ:。
(3)(1)(1)(3)(1)(2)(13)(1)(6)(5)(1)(4)(1)(3)(3)(1)(2)(4)(5)(10)(5)(2)(1)(2)(3)(2)(10)(8)(2)(17)(2)(2)(1)(1)(2)(3)(1)(5)(13)(22)(3)(1)关于递归改成循环或者堆栈实现的问题-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
关于递归改成循环或者堆栈实现的问题
来源:互联网 更新时间: 15:40:46 责任编辑:王亮字体:
用户提出问题:关于递归改成循环或者堆栈实现的问题,具体如下:
通过互联网整理获得以下解决方法:=================1楼=====================
能来个大牛指点下吗?
=================2楼=====================
没人?在线等啊
=================3楼=====================
我不是大牛
就我看到的讲一下,&不知道对你是否有用
&void&f(n)&应该改为&bool&f(n),&如
&&&&&&&if(!n)&return&
&&&&&&&else
&&&&&&&&&&&&&if&(!f(n/2))&return&
&&&&&&&&&&&&&if&(!f(n-n/2))&&return&
&&&&&&&&&&&&&m();//普通的函数
=================4楼=====================
上面的建议是基于我猜"结束条件"跟N有关,&如果确实跟N有关,&那当"结束条件"成立时return到上一级,&在上一级的N跟"结束条件"的N是不一样的,&而你原来的程式问题就在这里
=================5楼=====================
&&&&&&&if(...){结束条件}&
&&&&&&&else
&&&&&&&&&&&&&f(n/2);
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright &#169; 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号

我要回帖

更多关于 n网注册问题 的文章

 

随机推荐