首页 > 解决方案 > R:将while循环转换为递归

问题描述

我正在尝试将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),但我想不出办法。

标签: rloopsrecursion

解决方案


在我看来,如果你改变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

推荐阅读