2013-10-05 5 views
0

Я хочу рекурсивно сосчитать cylces журнала в моей функцииВычислить рекурсивно `журнал (журнал (журнал (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. Помните, что * new * значение '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 

EDIT: Если вам нужно использовать рекурсию, рассмотрим 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

You не нужно использовать Recall. Попробуйте следующее:

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

Ключом является попытка скомпоновать вашу функцию таким образом, чтобы не требовалось сохранять промежуточные результаты.

Смежные вопросы