R:将while循环转换为递归

时间:2018-12-10 08:51:50

标签: r loops recursion

我正在尝试将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),但是我想不出一种解决方法。

2 个答案:

答案 0 :(得分:2)

在我看来,如果将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

答案 1 :(得分:2)

您的函数需要知道<?xml version="1.0" encoding="utf-8"?> <AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/selector_material_single_line_edit_text" android:maxLines="1" android:paddingBottom="2dp" android:paddingTop="4dp" android:singleLine="true" android:textColorHighlight="@color/primary_material" android:textCursorDrawable="@drawable/shape_text_cursor" tools:ignore="LabelFor"/> 。如果您不想传递它,则需要将其存储在调用堆栈上所有函数都可以访问它的位置。对于您的具体情况,您可以改用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

另一种替代方法是我在this answer中演示的方法。