Qiita 7 - キータぞ、来たぞ、キータだぞー (786レス)
Qiita 7 - キータぞ、来たぞ、キータだぞー http://mevius.5ch.io/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.io/test/read.cgi/tech/1757733847/1
2: デフォルトの名無しさん [sage] 2025/09/14(日) 01:56:40.69 ID:CZ0V8fQ4 『【Go】配列を再帰的に逆順にするサンプルコードを書いてみた』 > 再帰を使うことで、ループを使わずにエレガントに実装できる。 根本的なところで誤解してる人な模様。 http://mevius.5ch.io/test/read.cgi/tech/1757733847/2
3: デフォルトの名無しさん [sage] 2025/09/14(日) 02:53:44.41 ID:bGojT+ur >>2 一般論として 再帰で表現した方が抽象度が高く理解しやすく定義そのまま表現できることが多い 特に末尾再帰をコンパイラがループへ変換してくれて実行効率が同等ならば全ての点で再帰による表記が勝る http://mevius.5ch.io/test/read.cgi/tech/1757733847/3
4: デフォルトの名無しさん [sage] 2025/09/14(日) 12:10:16.28 ID:RhzWmJy7 入力配列と出力配列渡してループで処理するわ http://mevius.5ch.io/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.io/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.io/test/read.cgi/tech/1757733847/6
7: デフォルトの名無しさん [sage] 2025/09/14(日) 13:28:33.58 ID:ZqIkDajJ そもそもの話として、ひとつの記事の中で複数の関数が引数だとか配列の内容を書き換えるのかどうかとか仕様が合ってないから比較になってないのよね。 http://mevius.5ch.io/test/read.cgi/tech/1757733847/7
8: デフォルトの名無しさん [] 2025/09/14(日) 13:42:25.65 ID:yOrWt/NI >>7 問題はそこだね ループでも書けるよとかの筋違いな批判は要らんて http://mevius.5ch.io/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.io/test/read.cgi/tech/1757733847/9
10: デフォルトの名無しさん [sage] 2025/09/14(日) 15:20:41.57 ID:wFXoVVHv >>9 大昔からの古典すら知らない無知 LISPも知らないんだろうな http://mevius.5ch.io/test/read.cgi/tech/1757733847/10
11: デフォルトの名無しさん [sage] 2025/09/14(日) 15:24:57.73 ID:ZqIkDajJ GoとLISPの区別もつかない人とはなあw http://mevius.5ch.io/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.io/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.io/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.io/test/read.cgi/tech/1757733847/14
15: デフォルトの名無しさん [] 2025/09/14(日) 18:13:30.88 ID:pN1ZIB1N >>6 何言ってんの爆速ですわ http://mevius.5ch.io/test/read.cgi/tech/1757733847/15
16: デフォルトの名無しさん [sage] 2025/09/14(日) 18:45:10.81 ID:d1cvwZ2J >何言ってんの爆速ですわ コードと実行結果のひとつでも挙げりゃ良いのだけど、それができない人がなんか言ってる感じw http://mevius.5ch.io/test/read.cgi/tech/1757733847/16
17: デフォルトの名無しさん [sage] 2025/09/14(日) 19:42:15.05 ID:buQYk9+g >>13 下手すぎ 最初に丸ごとcopyする時点でプログラミングのセンスがない http://mevius.5ch.io/test/read.cgi/tech/1757733847/17
18: デフォルトの名無しさん [sage] 2025/09/14(日) 19:59:01.07 ID:d1cvwZ2J 丸ごとcopyしない>>17のセンスある実装に期待w http://mevius.5ch.io/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.io/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.io/test/read.cgi/tech/1757733847/20
21: デフォルトの名無しさん [sage] 2025/09/15(月) 00:39:24.47 ID:Wq0UyIVm エンジニアならベンチ結果で語るべきだよな! http://mevius.5ch.io/test/read.cgi/tech/1757733847/21
22: デフォルトの名無しさん [sage] 2025/09/15(月) 00:41:02.81 ID:oHygyuIm 末尾再帰を自動的にループ化しないシステムもあれば appendするだけで毎回ムダに新たに別メモリを確保してしまうシステムもある Goは最悪だと実証された http://mevius.5ch.io/test/read.cgi/tech/1757733847/22
23: デフォルトの名無しさん [sage] 2025/09/15(月) 00:50:27.97 ID:cAmqpZFr このクソ仕様がGoの敗因っぽいね >appendは毎回新たなスライスを生成します http://mevius.5ch.io/test/read.cgi/tech/1757733847/23
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 763 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.010s