2013-10-05 67 views
0

我想递归数日志cylces在我的功能计算递归`日志(日志(LOG(134)))`

logCounter <- function(number) { 
    k <- 0 
    if(k>=0){ 
     k = k+1 
    } 
    result <- log(number) 
    if (result > 1) { 
     logCounter(result) 
    } else { 
     return(k) 
    } 
} 

logCounter(123)#returns 3 because log(log(log(123))) < 1 

然而,我的柜台k不工作,我会检查。因此,我真的很感谢你的回答!

+1

你快到了。首先,看看你在结果行之前有什么。在该函数的每次调用中,该代码都会导致'k'为'1'。你将'k'设置为0,然后检查它是否等于零(它是哪个),然后将它增加1,这会得到k = 1。请记住,每个呼叫都会创建一个* k新的*值,您不会将它们存储在两次呼叫之间。这就是为什么当你返回k时,你总是会得到'1'。 – nograpes

+0

@nograpes Thx为您的答案!但是,我真的不知道应该在哪里放置'k',以便它只被称为... – mrquad

+1

诀窍是添加一些东西添加每个返回,您根本不需要'k'。这是一个很大的暗示。你绝对应该回顾一些递归的例子。 – nograpes

回答

1

你可以不带while循环递归调用函数更容易做到这一点:

logCounter <- function(number) { 
    k <- 0 
    result <- number 
    while(result>1){ 
     k <- k + 1 
     result <- log(result) 
    } 
    return(k) 
} 

> logCounter(123) 
[1] 3 

编辑:如果你需要使用递归,考虑Recall功能:

logCounter <- function(number, iter=1) { 
    if(log(number)>1) 
     out <- Recall(log(number), iter+1) 
    else 
     out <- list(log(number),iter) 
    return(out) 
} 

> logCounter(123) 
[[1]] 
[1] 0.4518085 

[[2]] 
[1] 3 
+0

但是这肯定是作业和OP需要使用递归。 – nograpes

+1

@nograpes我们将会看到! – Thomas

+0

@Thomas @nograpes Thx为您的实施。事实上,它不是作业,而是一本书的问题(我想学习'R'),我真的想递归地实现函数... – mrquad

2

你不需要使用Recall。试试这个:

logCounter <- function(number) { 
    if (number <1) return(0) # A minor edit. 
    result <- log(number) 
    if (result > 1) return(logCounter(result)+1) 
    return(1) 
} 

关键是要以不需要存储中间结果的方式编写函数。