ループを使わずに1から10までの総和を計算させるのが流行っているらしい


ループを使わずに1から10までの総和を表示するプログラム – Bug Catharsis
vallog: 流行っていると聞いて – ループを使わずに1から10までの総和を表示するプログラム
ループを使わずに1から10までの総和を表示するプログラム – 医者を志す妻を応援する夫の日記

ので、Rで書いてみます。
[cpp]
sum(c(1:10))
[1] 55
[/cpp]
あ…

これだと面白くないので再帰っぽく。
再帰はループではないそうなので。

[cpp]
func <- function(n) {
if (n <= 1) return(1)
else n + func(n-1)
}
func(10)
[1] 55
[/cpp]

おーいい感じです。
お次はPythonで。
[python]
sum(range(1,11))
55
[/python]

…pythonお前ってやつは。。。

追記

@syou6162曰く
Twitter / Yasuhisa Yoshida: @myuhe Reduce辺りも追加をw

また、マニアックな。
でも、こっちの方がRっぽい気がする。
[cpp]
Reduce("+",c(1:10))
[1] 11
[/cpp]

始めて知ったんですが、Reduceってば単なるRの関数なんですね。
これ使ってる人見たことないですが、統計でご飯食べている人等にとっては便利な関数なんでしょう。

[cpp]
> Reduce
function (f, x, init, right = FALSE, accumulate = FALSE)
{
mis <- missing(init)
len <- length(x)
if (len == 0L)
return(if (mis) NULL else init)
f <- match.fun(f)
if (!is.vector(x) || is.object(x))
x <- as.list(x)
ind <- seq_len(len)
if (mis) {
if (right) {
init <- x[[len]]
ind <- ind[-len]
}
else {
init <- x[[1L]]
ind <- ind[-1L]
}
}
if (!accumulate) {
if (right) {
for (i in rev(ind)) init <- f(x[[i]], init)
}
else {
for (i in ind) init <- f(init, x[[i]])
}
init
}
else {
len <- length(ind) + 1L
out <- vector("list", len)
if (mis) {
if (right) {
out[[len]] <- init
for (i in rev(ind)) {
init <- f(x[[i]], init)
out[[i]] <- init
}
}
else {
out[[1L]] <- init
for (i in ind) {
init <- f(init, x[[i]])
out[[i]] <- init
}
}
}
else {
if (right) {
out[[len]] <- init
for (i in rev(ind)) {
init <- f(x[[i]], init)
out[[i]] <- init
}
}
else {
for (i in ind) {
out[[i]] <- init
init <- f(init, x[[i]])
}
out[[len]] <- init
}
}
if (all(sapply(out, length) == 1L))
out <- unlist(out, recursive = FALSE)
out
}
}
<environment: namespace:base>
[/cpp]

  • Foo

    1からnまでの総和なら?
    n*(n+1)/2 ですね。一番速いでしょう。

  • Foo

    1からnまでの総和なら?
    n*(n+1)/2 ですね。一番速いでしょう。