【问题标题】:sum up results of a recursive function within the same recursive function在同一个递归函数中总结一个递归函数的结果
【发布时间】:2018-12-13 04:26:38
【问题描述】:

我想建立一个像

这样的数据框

在头部我有一个数字 n 在阶乘中,阶乘(n)是一个递归函数 在总和之前的阶乘值的总和。

我编写了一个递归函数,它成功地生成了 head 和 factorial 列,但仍然在 sum 列中挣扎。

谢谢

R代码以下

fact <- function(n, x){
  if (n<=1){
    return (n)
  } else {
    n*fact(n-1)
  }
}



recurDf <- function(n, df){
  if (n<=1){
    df <- rbind (df,   data.frame("value" = paste('Value', n) , "factorial" = n, "previous.sum" = 1) )
    return (df)
  } else {
    if(is.null(df)) {
      #df <- data.frame(matrix(ncol = 3, nrow = 0))
      #colnames(df) <- c("value", "factorial", "previous.sum")
      df <- data.frame("value"= 'va', "factorial" =0, "previous.sum" = 0)
    }

    rbind (recurDf(n-1,df), data.frame("value" = paste('Value', n) , "factorial" = fact(n), "previous.sum" = sum(recurDf(n-1,df)$factorial) ))

  }
}

recurDf(4, NULL)

【问题讨论】:

  • 查看函数cumsum 以创建sum 列,例如cumsum(c(1,2,6,24))。您可以在第一列之外的一行中执行此操作,而不是在循环中
  • 而不是if (is.null(df)),使用if (missing(df))。然后你可以调用recurDF(4),而不是显式地传入NULL
  • 感谢@JonnyPhelps 提供的有用提示,对于 cumsum ,我无法使用它,因为我的函数比给定的示例更复杂,需要在同一个递归函数中运行 sum

标签: r recursion


【解决方案1】:

以下函数在其第一个分量中返回 n 的因子,并在其第二个参数中返回 n 的所有阶乘的累积和。

fact2 <- function(n) {
  if (n <= 1) c(1,1)
  else {
    prev <- Recall(n-1)
    n * prev[1] + c(0, prev[2])
  }
}

fact2(1)
## [1] 1 1
fact2(2)
## [1] 2 3
fact2(3)
## [1] 6 9
fact2(4)
## [1] 24 33

cbind(1:4, t(sapply(1:4, fact2)))
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    2    2    3
## [3,]    3    6    9
## [4,]    4   24   33

【讨论】:

    【解决方案2】:

    您是否有理由需要递归执行此操作?

    有很多更简单的方法可以得到你的答案。

    recurDf <- function(n){
      df <- data.frame("value" = c(paste('Value',1:n)) , "factorial" = c(1:n)) 
      df$factorial <- factorial(df$factorial)
      df$previous.sum <- cumsum(df$factorial)
      return (df)
    }
    
    recurDf(4)
    

    返回

        value     factorial   previous.sum
     1 Value 1         1            1
     2 Value 2         2            3
     3 Value 3         6            9
     4 Value 4        24           33
    

    【讨论】:

    • 感谢@Chris 的提议,但我的情况需要递归函数
    • @moufkir 在这种情况下,您只需将fact(n) 添加到rbindprevious.sum 部分即可。 "previous.sum" = sum(recurDf(n-1,df)$factorial) + fact(n)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多