【问题标题】:Recursive environments in RR中的递归环境
【发布时间】:2015-05-20 15:06:57
【问题描述】:

在 R 中使用递归时,递归环境也很有用。例如,在下面的示例中,下面的代码打印 1 到 9 会很有用。也就是说,每个递归环境中的 x 将比父环境中的 x 大一。有没有一种简单的方法来修改代码,使之成为这种情况?

x = 1
y = function() {
  print(x)
  x = x + 1
  if (x <= 10) y()
}

编辑:更复杂的情况只会涉及更多变量:

w = 1
x = 2
y = 3
z = 4
y = function() {
  print(x)
  w = w + 1
  x = w + x
  y = x + y
  z = y + z
  if (w <= 10) y()
}

现在不是四个变量,而是 50 个变量。这不能通过参数传递很容易地解决。

编辑2:

在编辑 1 中,我希望是这样的:

全局:w = 1,x = 2,y = 3,z = 4

递归 1:w = 2,x = 4,y = 7,z = 11

递归 2:w = 3,x = 7,y = 14,z = 25

等等。请原谅数学错误。

【问题讨论】:

  • 也许y &lt;- function(x = 1) {print(x); if(x &lt; 9) y(x+1) } ?
  • 这行得通,但我希望整个父环境都可用,而不仅仅是在递归之间传递的某些参数。
  • 可用是什么意思?
  • 不知道这个问题能否解决您的要求:stackoverflow.com/questions/7439110/…
  • 在当前示例中,函数y 覆盖了变量y。此外,对全局环境中的变量(例如w = w + 1)的任何更改都只会产生变量的本地副本,但保持原始变量不变。在您的情况下,这意味着该功能将永远不会完成。

标签: r recursion


【解决方案1】:

您可以使用 for 循环并在每次迭代时建立变量状态的向量。但是,如果它运行很长时间,这可能会变得低效。

w <- 1
x <- 2
y <- 3
z <- 4
while(w[1] <= 10){
  w <- c(w[1] + 1, w)
  x <- c(w[1] + x[1], x)
  y <- c(x[1] + y[1], y)
  z <- c(y[1] + z[1], z)
}
cbind(w, x, y, z)

如果您真的想使用递归环境(尽管我更喜欢循环解决方案),您可以通过在向量中传递所有四个变量来解决这个问题。

y <- function(v=c(w=1, x=2, y=3, z=4)) {
  print(v["x"])
  v["w"] <-      1 + v["w"]
  v["x"] <- v["w"] + v["x"]
  v["y"] <- v["x"] + v["y"]
  v["z"] <- v["y"] + v["z"]
  if (v["w"] <= 10){
    y(v)
  } else {
    v
  }
}
y()

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2017-12-06
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多