2013-02-22 3 views
1

Я создал следующий несильно, чтобы вычислить факториал заданного числа:Факториал цикла

factorial <- function(x){ 
y <- 1 
for(i in 1:x){ 
y <-y*((1:x)[i]) 
print(y) 
} 

} 


factorial(6) 

in console: 

[1] 1 
[1] 2 
[1] 6 
[1] 24 
[1] 120 
[1] 720 

6 = 720 так, очевидно, последнее число является правильным и расчет делает работу для всех чисел.

Проблема в том, что я хочу, чтобы последнее число было напечатано на консоль, есть ли способ сделать это? Я пытался превратить y в вектор внутри функции, но он, похоже, не работает.

+1

Почему вы не просто делаете 'факторный (1: 6) '? – thelatemail

+3

Или просто 'factorial (6)' – N8TRO

ответ

3

Переместить инструкцию печати вне цикла?

for(i in 1:x){ 
    y <-y*((1:x)[i]) 
} 
print(y) 
+0

О, мой бог, который раздражает, тратил 2 часа на это ... –

+0

Бывает у нас. :) – Achrome

+0

Большое вам спасибо! –

0

Просто поместите print() вне цикла

factorial <- function(x){ 
y <- 1 
for(i in 1:x){ 
y <-y*((1:x)[i]) 
} 
print(y) 
} 

Вы можете улучшить эту функцию ... почему (1:x)[i] и не только i? Почему print() и не return()? И самое главное: почему бы не использовать factorial() из базового пакета?

3

print отпечатки на экране. Функция возвращает результат последнего вычисленного выражения (или явное значение return). Вы хотите вернуть значение, а также распечатать его?

Это сказанное

R уже имеет функцию factorial которая вызывает gamma(x+1), используя тот факт, что для целочисленных значений gamma(x+1) == x!

так

factorial(6) 

gamma(7) 

Функция Вы писали будет иметь проблемы с переполнением целочисленного при умножении больших чисел, а также быть очень неэффективным, поскольку вы повторно переназначаете до y в цикле (Рекурсивным, если он не должен быть)

0
# take input from the user 
n <- as.integer(readline(prompt="Enter a number: ")) 
factorial = 1 #set factorial variable to 1 

# check is the number is negative, positive or zero 
if(n < 0) { 
    print("factorial does not exist for negative numbers") 
} else if(n == 0) { 
    print("The factorial of 0 is 1") 
} else { 
    for(i in 1:n) #for loop to expand n up to 1 
    { 
    factorial = factorial * i 
    } 
    print(paste("The factorial of", n ,"is",factorial)) 
} 
+0

это выглядит намного проще, если вы можете встроить его в функцию, которую он отлично работает – LORNA

+0

есть вопрос и ответ, написанные на том же языке? –

+0

да все это в R – LORNA

0

Вы можете определить функцию факториала с использованием функции возврата в конце кода:

factorial<-function(x){ 
     y<-1 
     for(i in 1:x) { 
     y<-y*((1:x)[i]) 
         } 
     return(y) 
      } 
Смежные вопросы