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 回答
在我看来,如果你将_12717改为
return(n)
,你会得到正确的结果 .你的功能需要知道
n
. 如果您不想传递它,则需要将其存储在调用堆栈上的所有函数都可以访问它的位置 . 对于您的具体情况,您可以使用sys.nframe
代替:但是,如果从另一个函数中调用函数,则不起作用:
另一种选择是我在this answer中演示的方法 .