首页 文章

R:将while循环转换为递归

提问于
浏览
0

I'm trying to convert a while loop to a recursion.

我知道while循环更有效,但我试图理解如何将 for/while 循环转换为递归,并递归到 for/while/if 循环 .

my function as I'm using a while loop:

harmon_sum <- function(x){
      n <- 1
      sum <- 0
      while (sum < x) 
      {
        sum <- sum + (1/n)
        n <- (n +1)
      }
      return(n)
    }

此函数采用一些数值,假设 x=2 ,并返回您需要求和的谐波和的对象数,以便创建一个比x更大的数字 . (对于x = 2,你需要总结谐波和的第一个 5 对象)

[![harmonic sum][1]][1]





**example**: `harmon_sum <- function(x){
   n <- 1
   sum <- 0
   while (sum < x) 
   {
     sum <- sum + (1/n)
     print(sum)
     n <- (n +1)
   print(n)
     }
   return(n)
 }

> harmon_sum(x =2)
[1] 1
[1] 2
[1] 1.5
[1] 3
[1] 1.833333
[1] 4
[1] 2.083333
[1] 5
[1] 5`

my version for the recursive function:

harmon_sum2 <- function(x, n =1){
   if( x<= 0){
    return(n-1)
    }
  else {
    x <- (x- (1/(n)))
    harmon_sum2(x, n+1)
  }
}

这给了我错误的答案 . 我宁愿找到只有一个变量(x)的解决方案,而不是使用两个变量(x,n),但我无法想办法做到这一点 .

2 回答

  • 2

    在我看来,如果你将_12717改为 return(n) ,你会得到正确的结果 .

    harmon_sum2 <- function(x, n=1){
      if( x <= 0){
        return(n)
      }
      else {
        x <- (x- (1/(n)))
        harmon_sum2(x, n+1)
      }
    }
    
    harmon_sum(2)
    [1] 5
    harmon_sum2(2)
    [1] 5
    harmon_sum(4)
    [1] 32
    harmon_sum2(4)
    [1] 32
    
  • 2

    你的功能需要知道 n . 如果您不想传递它,则需要将其存储在调用堆栈上的所有函数都可以访问它的位置 . 对于您的具体情况,您可以使用 sys.nframe 代替:

    harmon_sum2 <- function(x){
      if( x<= 0){
        return(sys.nframe())
      }
      else {
        x <- (x- (1/(sys.nframe())))
        harmon_sum2(x)
      }
    }
    
    harmon_sum(8)
    #[1] 1675
    harmon_sum2(8)
    #[1] 1675
    

    但是,如果从另一个函数中调用函数,则不起作用:

    print(harmon_sum2(8))
    #[1] 4551
    

    另一种选择是我在this answer中演示的方法 .

相关问题