【问题标题】:R: converting a while loop to recursionR:将while循环转换为递归
【发布时间】:2019-05-11 03:33:17
【问题描述】:

我正在尝试将 while 循环转换为递归。

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

我使用while 循环时的功能:

       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`

我的递归函数版本:

    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),但我想不出办法。

【问题讨论】:

    标签: r loops recursion


    【解决方案1】:

    在我看来,如果您将 return(n-1) 更改为 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
    

    【讨论】:

    • 是否可以定义输入仅包含在 x 中的函数?我的意思是,harmon_sum2 &lt;- function(x) 我知道这一定是可能的,因为 Church-Turing 论文
    • 我不知道。对我来说,您似乎还需要跟踪n。 @Roland 为此提供了解决方案。否则,您可以尝试为此提出一个新问题。也许理论计算机科学的姐妹网站会是一个更好的地方问:cstheory.stackexchange.com
    【解决方案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 中演示的方法。

    【讨论】:

    • 但返回错误答案
    • 它返回的答案和你原来的函数一样吗?
    • 它在我的系统上返回 5。
    猜你喜欢
    • 2020-09-05
    • 2013-07-20
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多