如何在R中编写递归函数,并将列表作为输入和输出

时间:2017-08-08 17:04:33

标签: r recursion

我想使用递归函数来表示多边形链的以下演变(没有特定原因):

step 1. The chain starts with 2 line segments and is (of course) opened;
step 2. close the polygonal chain with a new line segment;
step 3. open the polygonal chain;
step 4. GOTO 2

我希望获得一个列表,其中包含"时间(步骤编号)","指示链的状态(打开/关闭)",& #34;线段数(边缘)"。我创建了以下脚本,但我犯的一个错误是没有停止条件。我感谢我的帖子的评论员。我想我解决了这个问题。下面我将尝试使用新脚本来回答我自己的问题。

recursive.d <- function(d){
  t <- d[[1]]
  a <- d[[2]]
  k <- d[[3]]
  a <- !a  
  t <- t + 1
  k <- ifelse(a, k + 1, k)
  d <- list(t, a, k)
  d <- rbind(d[], recursive.d(d[]))
  return (d)
}

d_ini <- list(0, TRUE, 2)
recursive.d(d_ini)

但事实上,输出是Error: C stack usage 7970888 is too close to the limit。我做错了什么?

1 个答案:

答案 0 :(得分:0)

表达欲望的演变 基于GonçaloM。Tavares,“O Sr. Swedenborg”中的“欲望” (葡萄牙语)link to book

recursive.d <- function(d){
  t <- d[[1]] # time
  a <- d[[2]] # desire true/false
  k <- d[[3]] # edges
  k <- ifelse(a, k + 1, k)
  a <- !a  
  d <- list(t+1, a, k)
  if (t == 10) return(NA) # stop condition
  else
  d <- rbind(d[], recursive.d(d[]))
  return (d)
}

d_ini <- list(1, TRUE, 2)
desire <- rbind(d_ini, recursive.d(d_ini))
colnames(desire) <- c("Time", "Desire", "Edges")
desire

结果:

  Time Desire Edges
d_ini 1    TRUE   2    
      2    FALSE  3    
      3    TRUE   3    
      4    FALSE  4    
      5    TRUE   4    
      6    FALSE  5    
      7    TRUE   5    
      8    FALSE  6    
      9    TRUE   6    
      10   FALSE  7    
      NA   NA     NA