r - 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),但我想不出办法。
解决方案
在我看来,如果你改变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
推荐阅读
- javascript - 如何在 OpenLayers 的正确位置绘制特征
- python - 为什么我不能安装 Gi?
- asp.net-core - 从非交互式批处理以用户身份登录
- laravel - 如何使用 Laravel 编辑表单输入?
- java - 如何解决:无法解析 Json 数组。“不是原始数组”错误
- python - 错误:在我们可以连接之前浏览器似乎已经退出
- c++ - 如何在没有套接字管理的情况下使用 OpenSSL 库?
- android - 如何放置插件和库以连接到firebase?
- python - 如何从其他异步函数调用的同步函数调用异步代码?
- laravel - QUEUE_CONNECTION 'database' 有效,但 'redis' 抛出 'Array to String conversion'