Qiita 7 - キータぞ、来たぞ、キータだぞー (34レス)
Qiita 7 - キータぞ、来たぞ、キータだぞー http://mevius.5ch.net/test/read.cgi/tech/1757733847/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
1: デフォルトの名無しさん [sage] 2025/09/13(土) 12:24:07.83 ID:mucntwOq Hello hackers ! Qiitaは、エンジニアリングに関する知識を記録・共有するためのサービスです。 コードを書いていて気づいたことや、自分がハマったあの仕様について、 他のエンジニアと知見を共有しましょう ;) https://qiita.com/ Qiita(キータ)は、Incrementsが運営するプログラミング情報のナレッジコミュニティ。 2016年現在で日本最大のプログラマーコミュニティとされている[1]。 https://internet.watch.impress.co.jp/docs/news/1025972.html 前スレ Qiita https://mevius.5ch.net/test/read.cgi/tech/1542357242/ Qiita 2 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1658762410/ Qiita 3 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1685235361/ Qiita 4 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1705486836/ Qiita 5 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1717651046/ Qiita 6 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1739527246/ http://mevius.5ch.net/test/read.cgi/tech/1757733847/1
2: デフォルトの名無しさん [sage] 2025/09/14(日) 01:56:40.69 ID:CZ0V8fQ4 『【Go】配列を再帰的に逆順にするサンプルコードを書いてみた』 > 再帰を使うことで、ループを使わずにエレガントに実装できる。 根本的なところで誤解してる人な模様。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/2
3: デフォルトの名無しさん [sage] 2025/09/14(日) 02:53:44.41 ID:bGojT+ur >>2 一般論として 再帰で表現した方が抽象度が高く理解しやすく定義そのまま表現できることが多い 特に末尾再帰をコンパイラがループへ変換してくれて実行効率が同等ならば全ての点で再帰による表記が勝る http://mevius.5ch.net/test/read.cgi/tech/1757733847/3
4: デフォルトの名無しさん [sage] 2025/09/14(日) 12:10:16.28 ID:RhzWmJy7 入力配列と出力配列渡してループで処理するわ http://mevius.5ch.net/test/read.cgi/tech/1757733847/4
5: デフォルトの名無しさん [sage] 2025/09/14(日) 12:59:52.05 ID:ZqIkDajJ 記事の再帰版のコードは > func ReverseArray(arr []int, start, end int) []int { > // ベースケース: 配列の中央に到達したら終了 > if start >= end { > return arr > } > > // 要素を交換 > arr[start], arr[end] = arr[end], arr[start] > > // 再帰呼び出し: 範囲を狭めて継続 > return ReverseArray(arr, start+1, end-1) > } 引数で渡した配列の内容書き換えるんでreturn要らないんだよなあ。 再帰で書くよか繰り返しで書いた方が余程シンプルとも思う。 func ReverseArrayWithFor(arr []int, start, end int) { for start < end { arr[start], arr[end] = arr[end], arr[start] start += 1 end -= 1 } } http://mevius.5ch.net/test/read.cgi/tech/1757733847/5
6: デフォルトの名無しさん [sage] 2025/09/14(日) 13:06:57.84 ID:ZqIkDajJ 記事のスライス操作版のコードは > // ReverseArrayWithSlice はスライス操作で配列を逆順にする(再帰) > func ReverseArrayWithSlice(arr []int) []int { > // ベースケース: 要素が1つ以下なら逆順にする必要なし > if len(arr) <= 1 { > return arr > } > > // 最初の要素を取り出し、残りを再帰的に逆順にしてから結合 > return append(ReverseArrayWithSlice(arr[1:]), arr[0]) > } 引数の配列内容を書き換えないし再帰を説明する上では面白い例だと思うが、パフォーマンスは最低だ罠。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/6
7: デフォルトの名無しさん [sage] 2025/09/14(日) 13:28:33.58 ID:ZqIkDajJ そもそもの話として、ひとつの記事の中で複数の関数が引数だとか配列の内容を書き換えるのかどうかとか仕様が合ってないから比較になってないのよね。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/7
8: デフォルトの名無しさん [] 2025/09/14(日) 13:42:25.65 ID:yOrWt/NI >>7 問題はそこだね ループでも書けるよとかの筋違いな批判は要らんて http://mevius.5ch.net/test/read.cgi/tech/1757733847/8
9: デフォルトの名無しさん [sage] 2025/09/14(日) 14:21:09.67 ID:ZqIkDajJ ・引数は配列を渡すのみ ・内容を逆にした配列を返し、引数で渡した配列の内容は書き換えない という条件にしたとして、繰り返しで書くより再帰のほうが良い書き方ができるだろうか? func ReverseArrayWithFor(arr []int) []int { n := len(arr) result := make([]int, n) for i := 0; i < n; i++ { result[i] = arr[n - i - 1] } return result } 「全ての点で再帰による表記が勝る」という人には再帰の素晴らしさをぜひ証明してほしいところだが口だけ番長だろうなあ。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/9
10: デフォルトの名無しさん [sage] 2025/09/14(日) 15:20:41.57 ID:wFXoVVHv >>9 大昔からの古典すら知らない無知 LISPも知らないんだろうな http://mevius.5ch.net/test/read.cgi/tech/1757733847/10
11: デフォルトの名無しさん [sage] 2025/09/14(日) 15:24:57.73 ID:ZqIkDajJ GoとLISPの区別もつかない人とはなあw http://mevius.5ch.net/test/read.cgi/tech/1757733847/11
12: デフォルトの名無しさん [sage] 2025/09/14(日) 15:30:37.23 ID:ZqIkDajJ 記事のスライス操作版のコードは > // ReverseArrayWithSlice はスライス操作で配列を逆順にする(再帰) > func ReverseArrayWithSlice(arr []int) []int { > // ベースケース: 要素が1つ以下なら逆順にする必要なし > if len(arr) <= 1 { > return arr > } > > // 最初の要素を取り出し、残りを再帰的に逆順にしてから結合 > return append(ReverseArrayWithSlice(arr[1:]), arr[0]) > } 要素数1の配列を渡した場合は引数の配列をそのまま返してしまうので // ベースケース: 要素が0以下なら逆順にする必要なし if len(arr) <= 0 { とした方が良いな。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/12
13: デフォルトの名無しさん [sage] 2025/09/14(日) 15:35:06.93 ID:ZqIkDajJ 試しに ・引数は配列を渡すのみ ・内容を逆にした配列を返し、引数で渡した配列の内容は書き換えない 再帰で書いてみたが func ReverseArray(arr []int) []int { n := len(arr) result := make([]int, n) copy(result, arr) var reverseArray func(int, int) reverseArray = func(start int, end int) { if start < end { result[start], result[end] = result[end], result[start] reverseArray(start + 1, end - 1) } } reverseArray(0, n - 1) return result } エレガントとは程遠いな。 ぜひLISP仕込みのエレガントな例をGoで書いて披露してほしいものだ。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/13
14: デフォルトの名無しさん [sage] 2025/09/14(日) 17:50:25.98 ID:ZqIkDajJ ChatGPTに下記の質問投げたらそこそこ納得できる回答くれたわ。 「Go言語は末尾再帰はサポートされてるの?」 「末尾再帰最適化されないところでの再帰呼び出しは引数の範囲が不定だとスタックがどれくらい使われるかの予測はしづらいので要はGoでは引数の範囲が不定なところでの再帰呼び出しは使わない方が無難てことですね。」 「関数型言語で育った人とかで「再帰は繰り返し処理より常に正義」とかって人いるじゃない。ああいう人にはGoは辛いかもですね。」 「Lispにloopがサポートされても意地でも使わないとかの人いましたね。」 http://mevius.5ch.net/test/read.cgi/tech/1757733847/14
15: デフォルトの名無しさん [] 2025/09/14(日) 18:13:30.88 ID:pN1ZIB1N >>6 何言ってんの爆速ですわ http://mevius.5ch.net/test/read.cgi/tech/1757733847/15
16: デフォルトの名無しさん [sage] 2025/09/14(日) 18:45:10.81 ID:d1cvwZ2J >何言ってんの爆速ですわ コードと実行結果のひとつでも挙げりゃ良いのだけど、それができない人がなんか言ってる感じw http://mevius.5ch.net/test/read.cgi/tech/1757733847/16
17: デフォルトの名無しさん [sage] 2025/09/14(日) 19:42:15.05 ID:buQYk9+g >>13 下手すぎ 最初に丸ごとcopyする時点でプログラミングのセンスがない http://mevius.5ch.net/test/read.cgi/tech/1757733847/17
18: デフォルトの名無しさん [sage] 2025/09/14(日) 19:59:01.07 ID:d1cvwZ2J 丸ごとcopyしない>>17のセンスある実装に期待w http://mevius.5ch.net/test/read.cgi/tech/1757733847/18
19: デフォルトの名無しさん [sage] 2025/09/14(日) 21:05:23.33 ID:gAWV5uS0 いつも的外れな記事批判を繰り返している連投クンは本気でわからないようだな 元データを改変せずに新たに逆順を返す再帰関数を書きたいのならば例えばこうする func ReverseArray(input []int) []int { if len(input) == 0 { return nil } else { return append(ReverseArray(input[1:]), input[0]) } } http://mevius.5ch.net/test/read.cgi/tech/1757733847/19
20: デフォルトの名無しさん [sage] 2025/09/15(月) 00:35:19.13 ID:aenReHhk >>19と他のコードでベンチマークしてみた。要素数は10から10000。 https://ideone.com/DZJosr > 10: > ReverseArray9: 0.000001 > ReverseArray13: 0.000000 > ReverseArray19: 0.000002 > 100: > ReverseArray9: 0.000000 > ReverseArray13: 0.000000 > ReverseArray19: 0.000016 > 1000: > ReverseArray9: 0.000002 > ReverseArray13: 0.000040 > ReverseArray19: 0.000104 > 10000: > ReverseArray9: 0.000011 > ReverseArray13: 0.000293 > ReverseArray19: 0.000958 http://mevius.5ch.net/test/read.cgi/tech/1757733847/20
21: デフォルトの名無しさん [sage] 2025/09/15(月) 00:39:24.47 ID:Wq0UyIVm エンジニアならベンチ結果で語るべきだよな! http://mevius.5ch.net/test/read.cgi/tech/1757733847/21
22: デフォルトの名無しさん [sage] 2025/09/15(月) 00:41:02.81 ID:oHygyuIm 末尾再帰を自動的にループ化しないシステムもあれば appendするだけで毎回ムダに新たに別メモリを確保してしまうシステムもある Goは最悪だと実証された http://mevius.5ch.net/test/read.cgi/tech/1757733847/22
23: デフォルトの名無しさん [sage] 2025/09/15(月) 00:50:27.97 ID:cAmqpZFr このクソ仕様がGoの敗因っぽいね >appendは毎回新たなスライスを生成します http://mevius.5ch.net/test/read.cgi/tech/1757733847/23
24: デフォルトの名無しさん [sage] 2025/09/15(月) 08:10:37.10 ID:aenReHhk >>17が丸ごとcopyしないセンスある実装を晒してくれなかったので書いてみた。 func ReverseArray(arr []int) []int { n := len(arr) result := make([]int, n) var reverseArray func(int) reverseArray = func(i int) { if i < n { result[i] = arr[n - 1 - i] reverseArray(i + 1) } } reverseArray(0) return result } やはりセンスある感じではないな。素直に for で繰り返した方が素直な感じ。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/24
25: デフォルトの名無しさん [sage] 2025/09/15(月) 08:16:11.29 ID:aenReHhk ベンチマーク結果 https://ideone.com/mBV6Jr > 10: > ReverseArray9: 0.000001 > ReverseArray13: 0.000001 > ReverseArray19: 0.000003 > ReverseArray24: 0.000000 > 100: > ReverseArray9: 0.000000 > ReverseArray13: 0.000001 > ReverseArray19: 0.000024 > ReverseArray24: 0.000001 > 1000: > ReverseArray9: 0.000003 > ReverseArray13: 0.000061 > ReverseArray19: 0.000143 > ReverseArray24: 0.000006 > 10000: > ReverseArray9: 0.000013 > ReverseArray13: 0.000446 > ReverseArray19: 0.001487 > ReverseArray24: 0.000060 ReverseArray24が案外良いのは恐らくは再帰呼び出しをループにする最適化が行われている感じ。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/25
26: デフォルトの名無しさん [sage] 2025/09/15(月) 08:27:46.98 ID:aenReHhk ideone では Go のコンパイラが 1.12.1 と旧く、もっと新しい版(1.24.2)だと ReverseArray9 と ReverseArray24 の差は小さくなる模様。 https://godbolt.org/z/KW87qMWsf 出力コードも見ようとしたけどちょっと見る気起きないな。 main_ReverseArray19_pc0 の中で再帰呼び出ししてることは > CALL main.ReverseArray19(SB) 確認したが。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/26
27: デフォルトの名無しさん [sage] 2025/09/15(月) 08:41:05.40 ID:7N5dcPCF 一番シンプルにわかりやすい>>19を再帰呼び出しのままは厳しいな appendするたびに作り直すらしいGoの仕様が足を引っ張ってるのだろうか http://mevius.5ch.net/test/read.cgi/tech/1757733847/27
28: デフォルトの名無しさん [sage] 2025/09/15(月) 09:31:01.39 ID:G/lRv3X8 今のQiitaはこの程度の話すらコメ欄ではできないのがクソなんだよなあ。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/28
29: デフォルトの名無しさん [sage] 2025/09/15(月) 12:47:17.00 ID:aenReHhk なんか同じパラメータでの呼び出しを2回繰り返すと ReverseArray13 と ReverseArray19 だけ 2回目の速度が向上するな? https://ideone.com/zLdldJ > 1000: > ReverseArray9: 0.000003 > ReverseArray13: 0.000089 > ReverseArray19: 0.000174 > ReverseArray24: 0.000007 > 1000: > ReverseArray9: 0.000004 > ReverseArray13: 0.000005 > ReverseArray19: 0.000016 > ReverseArray24: 0.000007 > 10000: > ReverseArray9: 0.000018 > ReverseArray13: 0.000574 > ReverseArray19: 0.001747 > ReverseArray24: 0.000059 > 10000: > ReverseArray9: 0.000024 > ReverseArray13: 0.000035 > ReverseArray19: 0.000207 > ReverseArray24: 0.000055 キャッシュの影響ではなさそうだがなんぞコレ? こういうのは楽しい。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/29
30: デフォルトの名無しさん [sage] 2025/09/15(月) 13:03:08.76 ID:aenReHhk 要素数を1000から1000刻みで増やしていくと6000でガクッとパフォーマンス落ちてるな。 https://ideone.com/2yAyfW 再帰呼び出しを深く行うことでスタックが足りなくなりスタック領域の拡張が行われそれでパフォーマンスが落ちてる気がする。 予めスタック領域が十分拡張されてれば ReverseArray13 と ReverseArray19 のパフォーマンスも 1回目から比較的マシになりそうな気がする。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/30
31: デフォルトの名無しさん [sage] 2025/09/15(月) 13:16:02.23 ID:aenReHhk 試しにmain()の先頭にスタック領域を拡張してくれそうな処理を入れてみた。 var enlarge func(int) enlarge = func(n int) { if n > 0 { enlarge(n - 1) } } enlarge(100000) 実行結果 https://ideone.com/cJl9AC > 1000: > ReverseArray9: 0.000005 > ReverseArray13: 0.000011 > ReverseArray19: 0.000028 > ReverseArray24: 0.000009 > 10000: > ReverseArray9: 0.000032 > ReverseArray13: 0.000048 > ReverseArray19: 0.000273 > ReverseArray24: 0.000110 こうかは ばつぐんだ! http://mevius.5ch.net/test/read.cgi/tech/1757733847/31
32: デフォルトの名無しさん [sage] 2025/09/15(月) 13:23:08.72 ID:aenReHhk >>25で > ReverseArray24が案外良いのは恐らくは再帰呼び出しをループにする最適化が行われている感じ。 というのは多分間違いで、ReverseArray24 の前に実行している ReverseArray13 や ReverseArray19 のお陰でスタック領域が予め拡張されていたため ReverseArray24 の実行でスタック領域拡張処理が発生しなかったことがパフォーマンスが案外良かったことの原因と思われる。 http://mevius.5ch.net/test/read.cgi/tech/1757733847/32
33: デフォルトの名無しさん [sage] 2025/09/15(月) 19:24:06.27 ID:OSZOiNza IDコロコロ切り替えてる人は自分の投稿に自信がないのかな http://mevius.5ch.net/test/read.cgi/tech/1757733847/33
34: デフォルトの名無しさん [sage] 2025/09/15(月) 22:14:31.00 ID:wx2AhEF9 >>33 いや自信ないのはお前 いまはIDコロコロを言う流れでない 直前の投稿は同一IDで8件投稿してIDコロコロでない 安価なくIDコロコロと言われても何を言ってるのかわからない お前が自分の投稿に自信ないのは空気を読めず日本語が不自由だから http://mevius.5ch.net/test/read.cgi/tech/1757733847/34
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.336s*