1. you get an invisible
result (4);
2. check R's scoping rules (and try to understand it in detail);
3. if you have done 2, you should now understand that your code returns 1 when fed with 1; returns x+1 when x is another positive interger; returns a stack overflow for any other numeric value.
4. if you understand 3, re-write it in functional programing style during recursion;
一个R的程序,为什么不能运行?高手指点。。。
回复 第2楼 的 nan.xiao:今天断网,好不容易连上了。。。。我是想试试,能不能用递归在R中编程。比如,x=3输入后,在程序的最底层是f(1),想要的结果是:y=f(1),那么会输出1.如果输入的是f(3),即在最底层会自动返回上一层,上一层的下一步是x=x+1,就是x=3;然后再返回上一层,继续算x=x+1,即x=4,但是我不知道这个函数会返回什么。
回复 第3楼 的 alma2004:我在版主的回复上作了解释,在5楼
回复 第4楼 的 RemembeR discoveR, invent:some scoping rules searched from interenet helps me know about it.it returns 1 when input x=1;while I'm stapped in how it works with the codes of :....
f(x-1)
x<<-x+1
.....
嗯 R 是图灵完备的 支持递归
不过个人感觉递归对内存的消耗比较大 在统计计算中好像用得不是很多 一般能改写成循环就会用循环
例子依然木看懂
回复 第8楼 的 nan.xiao:真汗哪。。。是不是我表达能力太差了。。。数学语言就是这么抽象啊。貌似我刚叫了个同学来看,他说R是不能实现上面的递归的,R语言真的在算法上那么奇葩吗[s:16]
上一层的下一步是x=x+1,就是x=3
x 等于 3, x + 1 还等于 3 ?
回复 第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楼 的 谢益辉:好,谢谢指明方向。