• R语言
  • 一个R的程序,为什么不能运行?高手指点。。。

回复 第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楼 的 谢益辉:好,谢谢指明方向。