公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part14
https://mevius.5ch.net/test/read.cgi/tech/1644596656/
Rust part15
■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
2022/05/16(月) 21:30:56.46ID:W905eBh/
>>57
一番分かってないお前が言うなよw
一番分かってないお前が言うなよw
2022/05/16(月) 21:38:19.38ID:/vD2A9J9
>>61
高コストなCopyも実装してから確認してみてねww
高コストなCopyも実装してから確認してみてねww
2022/05/16(月) 21:38:29.32ID:NE3SiQoq
2022/05/16(月) 21:39:12.01ID:DoCeaK1g
>>67
デバッグビルドだけじゃなくリリースビルドでも確認してねw
デバッグビルドだけじゃなくリリースビルドでも確認してねw
2022/05/16(月) 21:42:44.19ID:51EzJkQ/
>>71
リリースモードでもどちらも同じ結果
リリースモードでもどちらも同じ結果
2022/05/16(月) 21:49:25.30ID:sElCPUyn
2022/05/16(月) 23:46:37.66ID:jfEIc0ZW
このスレはいつもおかしい人間たちが集まってるな
Rustの何が人を狂わせるんだ?
Rustの何が人を狂わせるんだ?
2022/05/17(火) 00:09:43.95ID:HbNyXd2X
おじさんイジリ飽きたので結論いっておく
Copyもmoveもスタックの中身をコピーしてるのは同じ
最適化によって不要なコピーが除去されるかどうかはLLVM次第
でかい配列やでかい構造体などの極一部を除けばCopyは参照の受け渡しよりも低コスト
ついでに言うと&TもCopy
Copyもmoveもスタックの中身をコピーしてるのは同じ
最適化によって不要なコピーが除去されるかどうかはLLVM次第
でかい配列やでかい構造体などの極一部を除けばCopyは参照の受け渡しよりも低コスト
ついでに言うと&TもCopy
2022/05/17(火) 00:26:01.61ID:+9bLcV37
2022/05/17(火) 02:09:56.03ID:2XRLgT14
>>76
ここでいうCopyのコストって具体的にどういう操作のコストのこと言ってる?
構造体データのbitwise-copyのこと?それとも別の何か?
Cloneやmoveの場合にそのコストは発生しないと主張しているの?
ここでいうCopyのコストって具体的にどういう操作のコストのこと言ってる?
構造体データのbitwise-copyのこと?それとも別の何か?
Cloneやmoveの場合にそのコストは発生しないと主張しているの?
2022/05/17(火) 02:13:55.30ID:tAEVG8cC
2022/05/17(火) 07:41:41.18ID:1GDSnWAB
>>78
俺も同じくCopyは自動的にclone()されると思ってた
そう思ってた理由はClone実装せずにCopy実装するとエラーとなるため
そこで実験
#[derive(Debug,Copy)]
struct S { not_cloned: usize, cloned: usize }
impl Clone for S {
fn clone(&self) -> Self {
S { not_cloned: self.not_cloned / 3, cloned: self.cloned }
}
}
fn main() {
let s0 = S { not_cloned: 123, cloned: 456 };
let s1 = s0.clone();
let s2 = s0; // copy
println!("Cloned: {s1:?}");
println!("Copied: {s2:?}");
}
結果
Cloned: S { not_cloned: 41, cloned: 456 }
Copied: S { not_cloned: 123, cloned: 456 }
別物になった…
俺も同じくCopyは自動的にclone()されると思ってた
そう思ってた理由はClone実装せずにCopy実装するとエラーとなるため
そこで実験
#[derive(Debug,Copy)]
struct S { not_cloned: usize, cloned: usize }
impl Clone for S {
fn clone(&self) -> Self {
S { not_cloned: self.not_cloned / 3, cloned: self.cloned }
}
}
fn main() {
let s0 = S { not_cloned: 123, cloned: 456 };
let s1 = s0.clone();
let s2 = s0; // copy
println!("Cloned: {s1:?}");
println!("Copied: {s2:?}");
}
結果
Cloned: S { not_cloned: 41, cloned: 456 }
Copied: S { not_cloned: 123, cloned: 456 }
別物になった…
2022/05/17(火) 10:53:02.16ID:GxF458pr
2022/05/17(火) 14:50:42.61ID:94ESmIzZ
ガイジムーブ来てんね
2022/05/17(火) 21:03:27.69ID:VS5jQHYL
Copyはshallow copyだわな
2022/05/17(火) 22:07:44.57ID:LjbtS7tD
色々と正確な情報が出揃ったところで質問
まず前提として話を明白かつ簡単にするため、
ここでは!DropつまりCopy実装可能な型のみ対象、
そしてもしClone実装するならば*selfつまりCopy実装と同一、
CloneやCopyを実装するかどうかは任意、
小文字のcloneとcopyはそれぞれCloneやCopyを実装した時にそれらが使われることを意味するとする
このとき、次のどちらの主張が正しい?
A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利」
B「copy/cloneのコストはmoveと同じなので回避する必要はない」
まず前提として話を明白かつ簡単にするため、
ここでは!DropつまりCopy実装可能な型のみ対象、
そしてもしClone実装するならば*selfつまりCopy実装と同一、
CloneやCopyを実装するかどうかは任意、
小文字のcloneとcopyはそれぞれCloneやCopyを実装した時にそれらが使われることを意味するとする
このとき、次のどちらの主張が正しい?
A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利」
B「copy/cloneのコストはmoveと同じなので回避する必要はない」
2022/05/17(火) 22:30:37.28ID:VUKzLr9a
場合による。
たとえコピーであっても結局は内容が同じものであると看破すれば
実際にはコピーしないようなコードを生成するといったことは有りうる。
Rust は原理的にエイリアス解析がやりやすい言語だと思うし。
実行コスト的にどうかなんて考えずに所有権管理の側面からの妥当性で決めたほうがよい。
その上でどうしても実行コストを切り詰めないといけないようになったならその時に考えればいい。
たとえコピーであっても結局は内容が同じものであると看破すれば
実際にはコピーしないようなコードを生成するといったことは有りうる。
Rust は原理的にエイリアス解析がやりやすい言語だと思うし。
実行コスト的にどうかなんて考えずに所有権管理の側面からの妥当性で決めたほうがよい。
その上でどうしても実行コストを切り詰めないといけないようになったならその時に考えればいい。
2022/05/17(火) 22:33:27.98ID:5/60CrrJ
2022/05/17(火) 23:40:20.70ID:XaJZCLYj
2022/05/17(火) 23:43:19.03ID:nlEgMvZ6
考えてみたけどmove/copyが問題になるレベルの大きさの型をスタックに置いて扱ったことが無いな…
使うとすれば固定長配列のバッファ?
でもそんなものmove/copyするわけないし
やっぱり考える意味の無い二択だと思う
使うとすれば固定長配列のバッファ?
でもそんなものmove/copyするわけないし
やっぱり考える意味の無い二択だと思う
2022/05/17(火) 23:47:41.13ID:FqAlYuq2
2022/05/17(火) 23:49:36.53ID:YviCLBk+
2022/05/17(火) 23:54:01.76ID:VUKzLr9a
2022/05/17(火) 23:55:13.39ID:tAEVG8cC
あっこの流れC++相談室で見たやつだ
2022/05/18(水) 00:07:06.58ID:P5Km+xQv
要は参照使えるなら使っとけって?
今更すぎませんか
今更すぎませんか
2022/05/18(水) 00:30:37.66ID:DGffctwq
オナコードペタペタされてたほうがマシだったなこりゃ
2022/05/18(水) 00:45:17.78ID:opn2S8Zb
>>92
それもあるが、例えば多数のコピーが行われているコードに対して、回避できる分を見直し、少数のコピーで済むように改善できる場合もある
Copy実装せずに明示clone()した方が見つけやすいかもしれない
それもあるが、例えば多数のコピーが行われているコードに対して、回避できる分を見直し、少数のコピーで済むように改善できる場合もある
Copy実装せずに明示clone()した方が見つけやすいかもしれない
2022/05/18(水) 01:26:17.77ID:lxQ5l4ey
2022/05/18(水) 01:42:43.25ID:d5NnfCmB
一人だけ間違った思い込みをしてるのに
説明されても「俺は間違ってない、間違ってるのはお前ら」が続くだけだからな
説明されても「俺は間違ってない、間違ってるのはお前ら」が続くだけだからな
2022/05/18(水) 01:46:16.75ID:6ezlEFaX
2022/05/18(水) 01:51:55.82ID:Da/MVUm8
2022/05/18(水) 02:06:14.30ID:UgigdTUo
100デフォルトの名無しさん
2022/05/18(水) 07:08:20.63ID:bcZKOTNR 大きいフィールドを持つ型には、Copyは実装しないだろうし普通はCopy/Moveのコスト差を気にすることなくない?
どちらにすべきかボーダーが難しいことはありそうだけど
どちらにすべきかボーダーが難しいことはありそうだけど
101デフォルトの名無しさん
2022/05/18(水) 07:14:11.27ID:P5Km+xQv >>94
データフローを見直して単純に消せるclone/copyは消せってことか?
それこそ今更すぎるわ
単純に消せないところまで消した後、さらにパフォーマンス改善するにはどうするかってことで、参照の話か?って聞いたんだけど
どこの誰とも知れないやつのフィボナッチのコードに対する指摘をされても知らねーよ
問題があって対策が分かってるなら自分で直すがいい
データフローを見直して単純に消せるclone/copyは消せってことか?
それこそ今更すぎるわ
単純に消せないところまで消した後、さらにパフォーマンス改善するにはどうするかってことで、参照の話か?って聞いたんだけど
どこの誰とも知れないやつのフィボナッチのコードに対する指摘をされても知らねーよ
問題があって対策が分かってるなら自分で直すがいい
102デフォルトの名無しさん
2022/05/18(水) 07:41:25.51ID:4GWzufxp103デフォルトの名無しさん
2022/05/18(水) 07:56:39.00ID:HgdHe2aE104デフォルトの名無しさん
2022/05/18(水) 08:12:27.72ID:BE/QrV8J 流れからすると本当はジェネリックのフィボナッチにCopyを付けないほうが有利と主張したかったんじゃね?
でも後から回避できないことに気づいて苦しい言い訳を重ねてるだけと見た
でも後から回避できないことに気づいて苦しい言い訳を重ねてるだけと見た
105デフォルトの名無しさん
2022/05/18(水) 08:21:27.45ID:6swlbHlO >>85
根拠も示さず批判だけする一番アカン人間やな
根拠も示さず批判だけする一番アカン人間やな
106デフォルトの名無しさん
2022/05/18(水) 08:33:04.08ID:6hDwlDoy >>104
フィボナッチはCopyを回避できないものなの?
フィボナッチはCopyを回避できないものなの?
107デフォルトの名無しさん
2022/05/18(水) 08:45:43.18ID:2HNq06l+ 分からないなら分からないから教えてって言えばいいのに意地を張るからこうなる
構えば構うほど意味不明な発言が出てくる
真面目に議論したいならせめてIDコロコロ変えるのやめな
構えば構うほど意味不明な発言が出てくる
真面目に議論したいならせめてIDコロコロ変えるのやめな
108デフォルトの名無しさん
2022/05/18(水) 09:10:15.39ID:Gy2qdhBc フィボナッチってこれだろ
f(0) = 0
f(1) = 1
f(n) = f(n - 1) + f(n - 2)
関数呼び出しに足し算に大量のコピーは避けられない
f(0) = 0
f(1) = 1
f(n) = f(n - 1) + f(n - 2)
関数呼び出しに足し算に大量のコピーは避けられない
109デフォルトの名無しさん
2022/05/18(水) 09:28:25.87ID:3vPi03ro >>87
async関数やasyncブロックで生成されるFutureは結構大きくなることがあって、boxingした方が性能出るケースもある
async関数やasyncブロックで生成されるFutureは結構大きくなることがあって、boxingした方が性能出るケースもある
110デフォルトの名無しさん
2022/05/18(水) 10:05:07.09ID:jV65BxdQ111デフォルトの名無しさん
2022/05/18(水) 10:20:40.09ID:AWXqkW+Q >>110
型制約からCopyを外せばプリミティブと言えどもcopyされなくなる
具体的には個々のプリミティブ型へモノモーフィゼーゼーションされる前の段階でCopy実装していない型に対してのcopy発生エラーが生じる
フィボナッチでcopyを回避するのは可能
型制約からCopyを外せばプリミティブと言えどもcopyされなくなる
具体的には個々のプリミティブ型へモノモーフィゼーゼーションされる前の段階でCopy実装していない型に対してのcopy発生エラーが生じる
フィボナッチでcopyを回避するのは可能
112デフォルトの名無しさん
2022/05/18(水) 10:38:43.35ID:2JRtSvHV 複オジの主張まとめ(1)
37, 39, 44
=====
CopyやCloneを使っているから別問題だろう。
一般的にRustのプログラミングでは、
Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。
そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。
もちろんCopyは最もコストが高い。
個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。
Copyはコストが一番高いから出来る限り避けるべきだな
特にヒープを使うならCloneまでにしておくべき
可能ならばCloneも避けるべきだが
37, 39, 44
=====
CopyやCloneを使っているから別問題だろう。
一般的にRustのプログラミングでは、
Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。
そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。
もちろんCopyは最もコストが高い。
個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。
Copyはコストが一番高いから出来る限り避けるべきだな
特にヒープを使うならCloneまでにしておくべき
可能ならばCloneも避けるべきだが
113デフォルトの名無しさん
2022/05/18(水) 10:39:05.95ID:2JRtSvHV 複オジの主張まとめ(2)
50, 52, 57
=====
それは理解不足すぎるぜ
大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ
moveは別方向の話であり比較対象にすらならない
比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな
デタラメすぎ
ムーブでビットパターンのコピーは発生しない
ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない
さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる
Copyのコピーはディープであって高コスト
これだけCopyやCloneを理解していない連中が多い状況だと
>>30の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか?
フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で
50, 52, 57
=====
それは理解不足すぎるぜ
大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ
moveは別方向の話であり比較対象にすらならない
比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな
デタラメすぎ
ムーブでビットパターンのコピーは発生しない
ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない
さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる
Copyのコピーはディープであって高コスト
これだけCopyやCloneを理解していない連中が多い状況だと
>>30の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか?
フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で
114デフォルトの名無しさん
2022/05/18(水) 10:41:41.09ID:2JRtSvHV 複オジの一連の主張を読んでから>>83の複オジ質問を読むべし
115デフォルトの名無しさん
2022/05/18(水) 10:44:21.46ID:Jso4/z1R 複おじに反応するやつも複おじ
116デフォルトの名無しさん
2022/05/18(水) 10:52:26.71ID:j9G6SOiS 主張が毎回変わる
口調も毎回変わる
表記も毎回変わる
間違いなく多重人格者
口調も毎回変わる
表記も毎回変わる
間違いなく多重人格者
117デフォルトの名無しさん
2022/05/18(水) 10:55:48.57ID:TXrPyH7a >>98
この文脈では○○にはなんでも当てはまるから意味がないよね
以下なら議論になる?
A「copy/cloneはmoveよりコストが生じるので、copyが必要な部分とそうでない部分で構造体を分離してでも出来るだけmoveを使用する」
B「copy/cloneのコストはmoveよりコストが生じるとは限らないので、一部でもcopyが必要な部分がある構造体は丸ごとcopyして構わない」
この文脈では○○にはなんでも当てはまるから意味がないよね
以下なら議論になる?
A「copy/cloneはmoveよりコストが生じるので、copyが必要な部分とそうでない部分で構造体を分離してでも出来るだけmoveを使用する」
B「copy/cloneのコストはmoveよりコストが生じるとは限らないので、一部でもcopyが必要な部分がある構造体は丸ごとcopyして構わない」
118デフォルトの名無しさん
2022/05/18(水) 11:00:11.80ID:TXrPyH7a >>116
そこまでいったらネット上では別人で良いだろ
そこまでいったらネット上では別人で良いだろ
119デフォルトの名無しさん
2022/05/18(水) 11:05:55.27ID:f/6XNiB/ >>108
やってみた
fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}
fn f(n: i32) -> i32 {
match n {
0 => 0,
1 => 1,
n => f(n - 1) + f(n - 2),
}
}
このあたりから非常に重くなった
f(43) = 433494437
f(44) = 701408733
f(45) = 1134903170
f(46) = 1836311903
f(47) = -1323752223
f(48) = 512559680
やってみた
fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}
fn f(n: i32) -> i32 {
match n {
0 => 0,
1 => 1,
n => f(n - 1) + f(n - 2),
}
}
このあたりから非常に重くなった
f(43) = 433494437
f(44) = 701408733
f(45) = 1134903170
f(46) = 1836311903
f(47) = -1323752223
f(48) = 512559680
120デフォルトの名無しさん
2022/05/18(水) 11:24:29.81ID:Rx65yaNy メモ化されてないんやから遅くなるのは当然
>>108は定義を示しただけちゃう?
>>108は定義を示しただけちゃう?
121デフォルトの名無しさん
2022/05/18(水) 11:25:30.07ID:Rx65yaNy つかオーバーフローしとるな
122デフォルトの名無しさん
2022/05/18(水) 11:29:30.10ID:e0i+LLok123デフォルトの名無しさん
2022/05/18(水) 12:13:31.53ID:QV9C5cPM ぼくのかんがえたさいきょうのcountup<T>()をみんなバカにしたので
ぼくのかんがえたさいきょうのfibonacchi<T>()でやっつけようとしたら
わざをだすまえにボコボコにやられてしまいました
く、くやしいです!
ぼくのかんがえたさいきょうのfibonacchi<T>()でやっつけようとしたら
わざをだすまえにボコボコにやられてしまいました
く、くやしいです!
124デフォルトの名無しさん
2022/05/18(水) 13:41:52.15ID:mX15beFi clone()が一個でコンパイル通ったからそのコードでのコピーは一回ではないか
use std::ops::{Add, Sub};
fn f<T>(n: T) -> T where T: Clone + PartialEq + TryFrom<usize> + Add<Output=T> + Sub<Output=T> {
let [zero, one, two] = [0, 1, 2].map(|n| T::try_from(n).ok().unwrap());
match n {
n if n == zero => zero,
n if n == one => one,
n => f(n.clone() - one) + f(n - two),
}
}
use std::ops::{Add, Sub};
fn f<T>(n: T) -> T where T: Clone + PartialEq + TryFrom<usize> + Add<Output=T> + Sub<Output=T> {
let [zero, one, two] = [0, 1, 2].map(|n| T::try_from(n).ok().unwrap());
match n {
n if n == zero => zero,
n if n == one => one,
n => f(n.clone() - one) + f(n - two),
}
}
125デフォルトの名無しさん
2022/05/18(水) 13:50:00.30ID:FQ8O/3lA >>119
計算量はO(n), メモリ使用量は定数オーダーにできるのになんで定義どおり実装したの?
計算量はO(n), メモリ使用量は定数オーダーにできるのになんで定義どおり実装したの?
126デフォルトの名無しさん
2022/05/18(水) 14:41:04.77ID:xTux5YG/ >>123
ぼくのかんがえたさいきょうのfizzbuzz<T>()もわすれないで
ぼくのかんがえたさいきょうのfizzbuzz<T>()もわすれないで
127デフォルトの名無しさん
2022/05/18(水) 15:04:45.49ID:dI/aN4vs >>125
そんな魔法はありません
そんな魔法はありません
128デフォルトの名無しさん
2022/05/18(水) 16:48:40.40ID:pQAvghMm >>127
え?
え?
129デフォルトの名無しさん
2022/05/18(水) 17:53:48.13ID:jsK0MVuh Rust以前の問題じゃん
スレ違い
スレ違い
130デフォルトの名無しさん
2022/05/18(水) 23:22:25.69ID:z2ufbs5N >>124
そのclone()は子のf(n-1)とf(n-2)やそれらの子孫でも呼ばれるので1回ではなくO(n)より大きい
それをO(n)すなわちn回+定数回以下に抑えられるのかどうか
あるいはO(0)回すなわち定数回以下に抑えられるのかどうか
そのclone()は子のf(n-1)とf(n-2)やそれらの子孫でも呼ばれるので1回ではなくO(n)より大きい
それをO(n)すなわちn回+定数回以下に抑えられるのかどうか
あるいはO(0)回すなわち定数回以下に抑えられるのかどうか
131デフォルトの名無しさん
2022/05/18(水) 23:41:48.24ID:RLh6XGtQ フィボナッチはu128を使ってもf(187)でオーバフローするからBigInt必須
clone()はできる限り少なくしないと厳しい
clone()はできる限り少なくしないと厳しい
132デフォルトの名無しさん
2022/05/19(木) 00:10:47.96ID:SnnzWk5R どうでもいいから複おじはTRPL読み直してきてね
133デフォルトの名無しさん
2022/05/19(木) 00:16:28.52ID:IEr5OW/T >>120
メモ化したら速くなったけど
memoをこちらで用意して毎回渡していくのを避けられないのかな?
fn main() {
let mut memo: Vec<usize> = Vec::new();
for n in 0..100 {
let f = f(n, &mut memo);
println!("f({n}) = {f}");
}
}
fn f(n: usize, memo: &mut Vec<usize>) -> usize {
if let Some(result) = memo.get(n) {
*result
} else {
let result = match n {
0 => 0,
1 => 1,
n => f(n - 1, memo) + f(n - 2, memo),
};
memo.push(result);
result
}
}
メモ化したら速くなったけど
memoをこちらで用意して毎回渡していくのを避けられないのかな?
fn main() {
let mut memo: Vec<usize> = Vec::new();
for n in 0..100 {
let f = f(n, &mut memo);
println!("f({n}) = {f}");
}
}
fn f(n: usize, memo: &mut Vec<usize>) -> usize {
if let Some(result) = memo.get(n) {
*result
} else {
let result = match n {
0 => 0,
1 => 1,
n => f(n - 1, memo) + f(n - 2, memo),
};
memo.push(result);
result
}
}
134デフォルトの名無しさん
2022/05/19(木) 00:24:17.53ID:d4KplWCH メモ化する必要ある?
直前の2つだけ記録しておけば次の一項が計算できるんだから再帰にする必要ないよね
直前の2つだけ記録しておけば次の一項が計算できるんだから再帰にする必要ないよね
135デフォルトの名無しさん
2022/05/19(木) 00:33:12.40ID:IEr5OW/T >>134
具体的にどうすればよいてすか?
具体的にどうすればよいてすか?
136デフォルトの名無しさん
2022/05/19(木) 00:46:08.98ID:HY3grr6d >>135
"rust fibonacci"でググるとよいです
"rust fibonacci"でググるとよいです
137デフォルトの名無しさん
2022/05/19(木) 01:21:23.38ID:f3pwm4rC >>134
直前の2つだけ記録して再帰にしない方法ならば
おそらくこうする案だと思うが
>>133がO(n)で済んでいるのに対して
これは二重のforによりO(n^2)になっていてこれは悪手
fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}
fn f(n: usize) -> usize {
match n {
0 => 0,
1 => 1,
n => {
let mut prepre = 0;
let mut pre = 1;
for i in 2..n {
let tmp = pre;
pre += prepre;
prepre = tmp;
}
pre + prepre
},
}
}
直前の2つだけ記録して再帰にしない方法ならば
おそらくこうする案だと思うが
>>133がO(n)で済んでいるのに対して
これは二重のforによりO(n^2)になっていてこれは悪手
fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}
fn f(n: usize) -> usize {
match n {
0 => 0,
1 => 1,
n => {
let mut prepre = 0;
let mut pre = 1;
for i in 2..n {
let tmp = pre;
pre += prepre;
prepre = tmp;
}
pre + prepre
},
}
}
138デフォルトの名無しさん
2022/05/19(木) 01:31:14.77ID:d4KplWCH >>135
fn main(){
for n in 0..10{
println!("f({}) = {}", n, f(n));
}
}
fn f(n:usize) -> usize{
let mut a = 0;
let mut b = 1;
for i in 0..n{
let tmp = b;
b = a + b;
a = tmp;
}
return a;
}
わざわざRustっぽい書き方をする必要はない
fn main(){
for n in 0..10{
println!("f({}) = {}", n, f(n));
}
}
fn f(n:usize) -> usize{
let mut a = 0;
let mut b = 1;
for i in 0..n{
let tmp = b;
b = a + b;
a = tmp;
}
return a;
}
わざわざRustっぽい書き方をする必要はない
139デフォルトの名無しさん
2022/05/19(木) 01:39:04.90ID:f3pwm4rC >>138
それもforが二重となっていて全体でO(n^2)だから同じく悪手
それもforが二重となっていて全体でO(n^2)だから同じく悪手
140デフォルトの名無しさん
2022/05/19(木) 02:09:27.74ID:XQuKTBpO >>131
なら尚のことジェネリックにする意味ないよね?
なら尚のことジェネリックにする意味ないよね?
141デフォルトの名無しさん
2022/05/19(木) 03:45:23.95ID:jyObMdH0 >>137,139
悪手ってなにをもって悪手だよ
一般項の導出は高校生でもできるレベルで、そうすればO(log(n))で求められるし、つまらん計算量改善のためだけのアルゴリズム議論はもうやめろ
これ以上計算量の話をするなら別のスレでやってくれ
悪手ってなにをもって悪手だよ
一般項の導出は高校生でもできるレベルで、そうすればO(log(n))で求められるし、つまらん計算量改善のためだけのアルゴリズム議論はもうやめろ
これ以上計算量の話をするなら別のスレでやってくれ
142デフォルトの名無しさん
2022/05/19(木) 04:01:44.79ID:f3pwm4rC143デフォルトの名無しさん
2022/05/19(木) 08:08:36.85ID:SnnzWk5R まあ(usize) -> usizeのインターフェースを持たせつつ逐次処理したければメモ化が楽だわな
Rustとは特に関係の無いアルゴリズム一般論の話だけど
Rustとは特に関係の無いアルゴリズム一般論の話だけど
144デフォルトの名無しさん
2022/05/19(木) 12:20:27.39ID:TVQgVkXp なんでmainのループまで計算量に入れてるの?
今やってるのはフィボナッチ数列の計算量の話でしょ
余計なところまで話し広げてどうするの?
今やってるのはフィボナッチ数列の計算量の話でしょ
余計なところまで話し広げてどうするの?
145デフォルトの名無しさん
2022/05/19(木) 12:42:29.01ID:Y0RaHe9J いい加減こんな語り尽くされた話終わってろ
何スレだよここ
何スレだよここ
146デフォルトの名無しさん
2022/05/19(木) 12:44:11.02ID:2eGzkY/T >>143
メモ化は良いが>>133のコードはインターフェースがあまりよくない
逆に>>138のコードはn個の列挙にO(n^2)も費やしている
以下のように書けばn個の列挙がO(n)に収まり、個別f(n)もO(n)で両立できる
fn main() {
println!("f(77) = {}", f(77));
for (n, f) in fibonacci_iter().enumerate() {
println!("f({n}) = {f}");
}
}
fn f(n: usize) -> usize {
fibonacci_iter().nth(n).unwrap()
}
fn fibonacci_iter() -> impl Iterator<Item=usize> {
let mut p = 0;
let mut q = 1;
std::iter::from_fn(move || {
let r = p;
p = q;
q += r;
Some(r)
})
}
メモ化は良いが>>133のコードはインターフェースがあまりよくない
逆に>>138のコードはn個の列挙にO(n^2)も費やしている
以下のように書けばn個の列挙がO(n)に収まり、個別f(n)もO(n)で両立できる
fn main() {
println!("f(77) = {}", f(77));
for (n, f) in fibonacci_iter().enumerate() {
println!("f({n}) = {f}");
}
}
fn f(n: usize) -> usize {
fibonacci_iter().nth(n).unwrap()
}
fn fibonacci_iter() -> impl Iterator<Item=usize> {
let mut p = 0;
let mut q = 1;
std::iter::from_fn(move || {
let r = p;
p = q;
q += r;
Some(r)
})
}
147デフォルトの名無しさん
2022/05/19(木) 12:47:27.97ID:wYj4kQtM 僕チンすごい!ってホルホルしたいんだろうけど
脳のワーキングメモリーが減ってこの程度の内容でしかコードが書けないんだろうな
脳のワーキングメモリーが減ってこの程度の内容でしかコードが書けないんだろうな
148デフォルトの名無しさん
2022/05/19(木) 13:06:09.75ID:TVQgVkXp まず計算量にmainのループを勘定してる時点で…
149デフォルトの名無しさん
2022/05/19(木) 13:18:54.57ID:u56F2Ocx150デフォルトの名無しさん
2022/05/19(木) 18:50:45.11ID:j8hvvms1 イテレーターにするとメリット多いんだな
Rustと相性いい
Rustと相性いい
151デフォルトの名無しさん
2022/05/19(木) 19:01:17.07ID:SnnzWk5R >>146はメモ捨ててるから計算済みのf(n)引っ張ってくるのに毎回O(n)かかるけどね
イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想
そろそろRustの話に戻ってもらっていいですか?
イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想
そろそろRustの話に戻ってもらっていいですか?
152デフォルトの名無しさん
2022/05/19(木) 19:56:30.02ID:X9gr9ket >>151
マジで>>133のメモ化が好ましいと思っているのか?
イテレータはメモ化とも相性が良い
例えば>>146のfibonacci_iter()を含むイテレータ汎用メモ化は即席でこんな感じ
fn main() {
let mut memo = IterMemo::new(fibonacci_iter());
assert_eq!(memo.nth(10), Some(55));
assert_eq!(memo.nth(0), Some(0));
assert_eq!(memo.nth(30), Some(832040));
assert_eq!(memo.nth(5), Some(5));
assert_eq!(memo.nth(50), Some(12586269025));
}
struct IterMemo<I> {
iter: I,
memo: Vec<usize>,
}
impl<I: Iterator<Item=usize>> IterMemo<I> {
fn new(iter: I) -> Self {
IterMemo { iter, memo: Vec::new() }
}
fn nth(&mut self, n: usize) -> Option<usize> {
for _i in self.memo.len()..=n {
if let Some(x) = self.iter.next() {
self.memo.push(x);
}
}
self.memo.get(n).cloned()
}
}
マジで>>133のメモ化が好ましいと思っているのか?
イテレータはメモ化とも相性が良い
例えば>>146のfibonacci_iter()を含むイテレータ汎用メモ化は即席でこんな感じ
fn main() {
let mut memo = IterMemo::new(fibonacci_iter());
assert_eq!(memo.nth(10), Some(55));
assert_eq!(memo.nth(0), Some(0));
assert_eq!(memo.nth(30), Some(832040));
assert_eq!(memo.nth(5), Some(5));
assert_eq!(memo.nth(50), Some(12586269025));
}
struct IterMemo<I> {
iter: I,
memo: Vec<usize>,
}
impl<I: Iterator<Item=usize>> IterMemo<I> {
fn new(iter: I) -> Self {
IterMemo { iter, memo: Vec::new() }
}
fn nth(&mut self, n: usize) -> Option<usize> {
for _i in self.memo.len()..=n {
if let Some(x) = self.iter.next() {
self.memo.push(x);
}
}
self.memo.get(n).cloned()
}
}
153デフォルトの名無しさん
2022/05/19(木) 21:07:44.82ID:wYj4kQtM 汚いな
154デフォルトの名無しさん
2022/05/19(木) 21:11:33.57ID:+7PnyNeM 複オジは何が問題だと指摘されてるのか理解しないんだよなぁ
頭悪いのにとにかくマウントだけ取りたがって恥の上塗り上塗り上塗り
何回塗るねんっw
頭悪いのにとにかくマウントだけ取りたがって恥の上塗り上塗り上塗り
何回塗るねんっw
155デフォルトの名無しさん
2022/05/19(木) 21:20:54.65ID:5LQoe3Bs ほらなw
ぼくのかんがえたさいきょうのひぼなっちいてれーた!
どや!? どやどやどや!!?
これで1000まで行くよw
ぼくのかんがえたさいきょうのひぼなっちいてれーた!
どや!? どやどやどや!!?
これで1000まで行くよw
156デフォルトの名無しさん
2022/05/19(木) 21:27:22.70ID:SnnzWk5R どうしてもイテレータが欲しいなら>>133に建て増ししたほうがよっぽど整理されていいよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=86c556a9709d959e8b9ecff08223b099
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=86c556a9709d959e8b9ecff08223b099
157デフォルトの名無しさん
2022/05/19(木) 21:29:51.14ID:u7/IlrFk158デフォルトの名無しさん
2022/05/19(木) 21:34:02.60ID:wYj4kQtM その前に単純にバグ入りだけど
159デフォルトの名無しさん
2022/05/19(木) 21:51:56.08ID:MGh63lg3 メモ化と個別機能が完全に分離できている>>152の方が良さげ
160デフォルトの名無しさん
2022/05/19(木) 21:55:11.08ID:wYj4kQtM このスレだけでなくRust書く人間はコケ前提なのが馬鹿らしい
未知の計算するのに対策してない馬鹿野郎ども
未知の計算するのに対策してない馬鹿野郎ども
161デフォルトの名無しさん
2022/05/19(木) 21:56:15.85ID:wYj4kQtM 目が覚めろ
目が覚めろ
コケ前提は恥ずかしい
目が覚めろ
コケ前提は恥ずかしい
162デフォルトの名無しさん
2022/05/19(木) 21:56:34.11ID:iLpWQ9zs163デフォルトの名無しさん
2022/05/19(木) 21:58:30.11ID:wYj4kQtM Rust書く人間はレベルが低いと思われても平気なのか?
164デフォルトの名無しさん
2022/05/19(木) 22:05:28.50ID:+v1Fmw4c165デフォルトの名無しさん
2022/05/19(木) 22:13:58.00ID:G2OEvBhv 「Rustでドヤりたい素人が犯しがちな12の過ち」
みたいな記事が捗りそう
みたいな記事が捗りそう
166デフォルトの名無しさん
2022/05/19(木) 22:18:44.85ID:iQApRYmM >>164
関数の設計ができない人の発想
関数の設計ができない人の発想
167デフォルトの名無しさん
2022/05/19(木) 22:22:18.18ID:z7fdj+fO >>164
なんでIDコロコロ変えてるの?
なんでIDコロコロ変えてるの?
168デフォルトの名無しさん
2022/05/19(木) 22:27:10.61ID:2ZXoSlQ2■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 「タワマン天国」に飛びつく若者…SNSに転がる「成功体験」に続けるのか 湾岸エリアの業者が語った現実 [蚤の市★]
- 【悲報】高市効果で「1ドル=160円」が相場へwwwwwwwwwwwwwwwwwwwwwwwwwwwww 止まらぬ高市円安💥💥 [871926377]
- 小川彩佳アナ「高市総理はここまで影響が出ることを想像して発言したんでしょうか」高市ソルジャー「!!!!(シュババババ)」 [931948549]
- 【悲報】おこめ券、9.5億円配布分のうち2.4億が経費、うちJAが1億円中抜き🤗高市ありがとう [359965264]
- FGOで好きなサーヴァントがアビゲイル、北斎、楊貴妃なんだが
- 自閉症が「んなっしょい」と連呼するお🏡
- 【悲報】高市有事で日本に同調する国、1つも現れないwwwwwwwwwwwwwww [603416639]
