2017-10-24 24 views
5

dizisinin toplam hesaplamak içinFonksiyon, bir dizi, aşağıda durumda iki giriş (1 ve 11) sahip olacaktır</p> <p>R. bu dizinin toplamını hesaplamak için çalışıyorum

1 + (1 * 2/3) + (1 * 2/3 * 4/5) + (1 * 2/3 * 4/5 * 6/7) + ....................(1 *......10/11) 

Sanırım, kendimi tanımlamak, buraya gitmenin yoludur.

+0

bu sekans herhangi bir matematiksel adı var mı? – amrrs

+1

Bu terim '(1 * 2/3) 'eksik mi? – Jimbou

+0

@Jimbou Evet Üzgünüm, soruyu yeni güncelledim. Teşekkür – Sid29

cevap

5

Sadece burada eski moda döngüleri kullanarak deneyebilirsiniz: Sen daha yüksek bir değere 1 den, istediğiniz herhangi bir değere num_terms ayarlayabilirsiniz

sum <- 0 
num_terms <- 6 
for (i in 1:num_terms) { 
    y <- 1 
    if (i > 1) { 
     for (j in 1:(i-1)) { 
      y <- y * (j*2/(j*2 + 1)) 
     } 
    } 
    sum <- sum + y 
} 

. Bu, söz konusu terimlerin istenilen sayı olduğu için bu durumda, 6 terimleri kullanırlar.

Biri muhtemelen gelip bir satıra yukarıdaki tüm kod parçasını azaltmak, ancak aklımda açık bir döngü burada haklı olacaktır.

Demo

+0

idealdir. Çok teşekkür ederim :) – Sid29

3

Benim yaklaşım:

# input 
start <- 1 
n <- 5 # number of terms 

end <- start + n*2 

result <- start 
to_add <- start 

for (i in (start + 1):(end-1)) { 
    to_add <- to_add * (i/(i + 1)) 
    result <- result + to_add 
} 

verir Burada

doğrulama amacıyla, terimlerin her kullanılıyor değerleri dışarıda yazdıran bir demo için bir link:

> result 
[1] 4.039755 
+0

Bu, niyetlediğiniz sonuçları vermeyebilir. ': Örneğin, '= 1' ve 'ucu = 2', bir döngü için sınırları (1. 2) için' olacaktır başlar. –

+0

Hmm true. Kodu değiştirdim, böylece girişin başlangıç ​​numarası ve – brettljausn

1

Başka bir temel R alternatifi kullanarak İç koşullar oluşturmak için cumprodc(1, seq(2, 10, 2))/c(1, seq(3, 11, 2)) 1, 2/3, 4/5, 6/7, 8/9, 10/11 ve cumprod toplu ürün alır dizisi üreten, burada

sum(cumprod(c(1, seq(2, 10, 2))/c(1, seq(3, 11, 2)))) 
[1] 3.4329 

olup. Bu sonuç sum ile toplanmıştır. İade edilen sonuç, kabul edilen cevaptaki ile aynıdır.

+0

'u izleyen terimlerin sayısı. Bu, benim yorumumla aynıdır ”a <- seq (1, 11, 2); toplamı (C (1, cumprod ((a-1) [1 -]))/cumprod (a)) ' – Jimbou

+0

@Jimbou Evet. Bu cevabı çıkardıktan ve yorum yazdıktan sonra bu yorumu gördüm. Cevabınıza eklemek isterseniz, bana bildirin ve onu silerim. – lmo

1

deneyebileceğiniz:

library(tidyverse) 
Result <- tibble(a=seq(1, 11, 2)) %>% 
    mutate(b=lag(a, default = 0)+1) %>% 
    mutate(Prod=cumprod(b)/cumprod(a)) %>% 
    mutate(Sum=cumsum(Prod)) 
Result 
    # A tibble: 6 x 4 
     a  b  Prod  Sum 
    <dbl> <dbl>  <dbl> <dbl> 
1  1  1 1.0000000 1.000000 
2  3  2 0.6666667 1.666667 
3  5  4 0.5333333 2.200000 
4  7  6 0.4571429 2.657143 
5  9  8 0.4063492 3.063492 
6 11 10 0.3694084 3.432900 

# and some graphical analysis 
Result %>% 
    ggplot(aes(as.factor(a), Prod, group=1)) + 
    geom_col(aes(as.factor(a), Sum), alpha=0.4)+ 
    geom_point() + 
    geom_line() 

enter image description here