2016-11-30 76 views
-2
f <- function(n){ 
    s <- 0 
    for (i in 1:n){ 
    s <- s + (i/2) 
    } 
    print(s) 
} 

棘手的部分當然是s遞歸從以前的循環依賴的..你會如何在R(s + = i/2)中引入這個循環?

[編輯]

謝謝您的解答。我只是試圖用R中的矢量化來比較循環中的性能增量。

,其中n = 10億以上函數採用287秒,同時兼具sum((1:n)/2)sum(seq_len(n)/2)返回我一個錯誤,該系統「不能分配大小7.5 GB的載體」

爲了比較,相同的功能(與正= 1000000000)在Julia需要38秒(0.87定義s的類型),在C++ 2.48秒/0.87編譯與優化和Python98秒/0.88使用Numba裝飾器。

+3

這不是'sum(1:n)/ 2'嗎? – Psidom

+2

你爲什麼要矢量化循環?它只是n *(n + 1)/ 4,可以在恆定的時間內計算。 –

+0

這也取決於你的機器,我運行'sum(seq_len(n)/ 2)''n = 1000000000',我得到了'2.5e + 17'作爲答案,沒有任何錯誤。平均需要大約5.5秒的時間。 – 989

回答

7

你可以這樣做(如果n>0):

sum(seq_len(n)/2) 

f(10) 
#[1] 27.5 

sum(seq_len(10)/2) 
#[1] 27.5 

如果n<0

sum((1:n)/2) 

n <- -11 
f(n) 
#[1] -32.5 

sum((1:n)/2) 
#[1] -32.5 

只是一個快速的標杆:

library(microbenchmark) 
n <- 10000 

f1 <- function(n) sum(seq_len(n)/2) 
f2 <- function(n){ s <- 0;for (i in 1:n){s <- s + (i/2);};s} 

f1(n)==f2(n) 
# [1] TRUE 
microbenchmark(f1(n), f2(n)) 

# Unit: microseconds 
    # expr  min  lq  mean median  uq  max neval 
# f1(n) 20.733 22.235 27.51751 22.836 24.639 82.028 100 
# f2(n) 3971.008 4275.383 4517.52582 4484.510 4648.867 5867.272 100 
+0

您的編輯已在另一篇文章中得到解答。 – akrun

+0

@PierreLafortune一個更好的方式來說這將是「這將與負數錯誤,而原來的代碼將**提供不正確的結果**因爲我會打賭你OP任何金錢根本沒有考慮負數 –

+0

@ 989:我只是堅持用'seq_len'。 –

2

這是什麼意思?

n<-10 
print(sum((1:n)/2))