在 R 中撰寫一個函式,輸入一個整數 ?? ≥1,并回傳最接近 s 的五邊形數作為輸出。也就是說,你的函式的輸出應該是滿足|???? ???|≤|???? ???| 的五邊形數???? 對于所有正整數 m。如果有兩個這樣的五邊形數????,你的函式可以回傳其中一個。通過運行 R 命令 rpois(5,lambda=800) 1 來測驗您的函式是否有五個不同的 s 值。
好的,這是我查找第 n 個五邊形數的代碼:
pentagonal_numbers=function(n){
sum=0
l=2*n-1
for(k in n:l){
sum=sum k
}
return(sum)
}
那么如何找到最接近輸入值的第n個五邊形值呢?
uj5u.com熱心網友回復:
我相信這個問題的總體思路是首先找到第 n 個 S 最接近五邊形數的數。首先,你用 S 表示 n,它是
因此,讓我們用 S 替換您看到的 x。好的,然后您輸入 S 的隨機值并找到 n。現在,如果您得到一個很可能的浮點數。
pn <- floor(n)
pm <- ceiling(n) #since pm is p(n 1) hence pm > pn
min(abs(pn-s),abs(pm-s))
這是解決代碼的總體思路。找到 n 的值后,您可以將 n 輸入到原始函式中
uj5u.com熱心網友回復:
我們可以看到查詢數字的范圍受到限制,因此一個簡單的蠻力方法就足夠了。在這里,我們可以估計值的間隔,比如第 10 個和第 30 個數字之間。
set.seed(1)
x <- rpois(5,lambda=800) 1
f <- function(n, m){
x <- vector("integer", m[2]-m[1])
x <- (\(.) (3*.**2 - .) / 2)(m[1]:m[2])
Vectorize(function(n, x){
ind <- Position((\(f,b) \(a) f(a,b))(`>`, n), x)
x[c(ind-1, ind)] |>
(\(.).[which.min(abs(n - .))])()
}, vectorize.args = c("n"))(n, x)
}
x
#> [1] 783 838 836 812 757
f(x, c(10, 30))
#> [1] 782 852 852 782 782
請注意,這不能很好地擴展(為 n < 1 000 000 找到 50 000 個最接近的值需要 17 秒)
x <- sample.int(1e6, size = 5e4, replace = T)
f(x, c(1, 850))
對于這么寬的區間,最好先構建哈希表,然后縮小每個數字的區間,然后匹配到表。
hash_pent <- function(n){
as.list(Vectorize(\(.) (3*.**2 - .) / 2)(1:n)) |>
setNames(as.character(1:n)) |>
list2env(hash = T)
}
h <- hash_pent(10000)
從那里去。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368535.html
標籤:r
