回复 第9楼 的 zhanhang_xiao:阅帖八千,仍然没看懂楼主的帖子,什么上层下层跟盗梦空间似的,我实在是看得很凌乱。只能胡乱蒙一个,您的意思是这个?
f = function(x) {<br />
if (x == 1) 1 else f(x - 1) + 1<br />
}<br />
f(1)<br />
f(2)<br />
f(3)
</p>回复 第9楼 的 zhanhang_xiao:阅帖八千,仍然没看懂楼主的帖子,什么上层下层跟盗梦空间似的,我实在是看得很凌乱。只能胡乱蒙一个,您的意思是这个?
f = function(x) {<br />
if (x == 1) 1 else f(x - 1) + 1<br />
}<br />
f(1)<br />
f(2)<br />
f(3)
</p>回复 第11楼 的 谢益辉:I think this is what s/he asks. But s/he does not seem to understand static vs dynamic scoping, or, the difference between enclosure and call stack.
回复 第11楼 的 谢益辉:[s:11]很欣慰,这样写是我的意思。但是我试着写这个程序,其实是想弄清楚,R语言能不能在每次调用自身函数之后再每次进行一次运算之类的(可能还是调用一个函数等等),说得比较抽象,不知道仍然说清楚了没
回复 第10楼 的 nan.xiao:嗯,是我表述的问题,求谅解
递归虽然写起来简单漂亮 但是费内存 在现实应用中尽量避免吧
回复 第11楼 的 谢益辉: 盗梦空间要是能支持 x <<- x + 1
还好了呢,直接 kick 回最上层 。。。
回复 第15楼 的 nan.xiao:最近看算法的书,就想试试看行不行。结果一大堆问题都出现了。
回复 第13楼 的 zhanhang_xiao:我觉得这不是R的问题吧,任何递归都是这样,当你用到函数本身之后,盗梦空间就直接向下走了,本层空间之后的任务只能等从最底层空间往上走完了才能继续执行。我仍然很凌乱,继续蒙:
f = function(x) {<br />
if (x == 1) 1 else {<br />
res = f(x - 1) + 1<br />
message('hello, ', x)<br />
res<br />
}<br />
}
</p>
但如15楼所说,你在研究一个坑爹的问题,R的递归能避免就避免。我几乎只在一种情况下递归:处理有递归结构的数据时(参见Elements of Programming Style)。例如XML文档就是典型的嵌套结构,你需要一层一层往下看。那些经典的递归算法什么的你了解思想就可以了,在R里面实战的话,我觉得不靠谱。
回复 第17楼 的 zhanhang_xiao:R是统计的语言,强项在统计。你要算两只兔子生小兔子的问题,用C或别的语言会好得多。
In terms of efficiency of recursoin, I wonder how to trigger tail recursion in R. [s:16]
> f=function(x){<br />
f0=function(x,rslt){<br />
print(sys.frames()[-1])<br />
if(x==1L) return(rslt) else Recall(x-1L, rslt+1L)<br />
}<br />
f0(x, 1L)<br />
}<br />
><br />
> fx = function(x) {<br />
print(sys.frames())<br />
if (x == 1L) 1L else Recall(x - 1L) + 1L<br />
}<br />
><br />
><br />
> f(2L)<br />
[[1]]<br />
<environment: 0x16400c8></p>
<p>[[1]]<br />
<environment: 0x16400c8></p>
<p>[[2]]<br />
<environment: 0x163db90></p>
<p>[[3]]<br />
<environment: 0x163dae8></p>
<p>[1] 2<br />
><br />
> fx(2L)<br />
[[1]]<br />
<environment: 0x16500a8></p>
<p>[[1]]<br />
<environment: 0x16500a8></p>
<p>[[2]]<br />
<environment: 0x1e1f478></p>
<p>[[3]]<br />
<environment: 0x1e1f408></p>
<p>[1] 2<br />
</p>回复 第18楼 的 谢益辉:嗯,学习了。能不用递归的肯定不会用,至少它太坑爹了,而且机会也不多。就是想问下谢大侠,如果对程序做个修改:
g=function(res){
res<<-res-1
}
f = function(x) {
if (x == 1) 1 else {
res = f(x - 1) + 2
g(res)
message('hello, ', x)
res
}
}
修改后是想和修改前的效果是一样的(修改后定义了全局变量res),但是结果不太一样。能再帮我看看么
回复 第16楼 的 nan.xiao:为什么是这样的,我不太懂
我没空看你的代码,但双箭头比递归更坑爹,就目前你的R小宇宙,建议两年之后再考虑使用它,或者这辈子都不要用它,因为你真正需要它的机会极少,一旦开启这个潘多拉盒子,你自己就得负责。参见 http://cos.name/cn/topic/106805
回复 第22楼 的 谢益辉:好,谢谢指明方向。