Qiita 7 - キータぞ、来たぞ、キータだぞー (33レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

5: デフォルトの名無しさん [sage] 09/14(日)12:59 ID:ZqIkDajJ(1/8) AAS
AA省
6
(1): デフォルトの名無しさん [sage] 09/14(日)13:06 ID:ZqIkDajJ(2/8)
記事のスライス操作版のコードは

> // ReverseArrayWithSlice はスライス操作で配列を逆順にする(再帰)
> func ReverseArrayWithSlice(arr []int) []int {
>   // ベースケース: 要素が1つ以下なら逆順にする必要なし
>   if len(arr) <= 1 {
>     return arr
>   }
>
>   // 最初の要素を取り出し、残りを再帰的に逆順にしてから結合
>   return append(ReverseArrayWithSlice(arr[1:]), arr[0])
> }

引数の配列内容を書き換えないし再帰を説明する上では面白い例だと思うが、パフォーマンスは最低だ罠。
7
(1): デフォルトの名無しさん [sage] 09/14(日)13:28 ID:ZqIkDajJ(3/8)
そもそもの話として、ひとつの記事の中で複数の関数が引数だとか配列の内容を書き換えるのかどうかとか仕様が合ってないから比較になってないのよね。
9
(1): デフォルトの名無しさん [sage] 09/14(日)14:21 ID:ZqIkDajJ(4/8)
・引数は配列を渡すのみ
・内容を逆にした配列を返し、引数で渡した配列の内容は書き換えない
という条件にしたとして、繰り返しで書くより再帰のほうが良い書き方ができるだろうか?

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
}

「全ての点で再帰による表記が勝る」という人には再帰の素晴らしさをぜひ証明してほしいところだが口だけ番長だろうなあ。
11: デフォルトの名無しさん [sage] 09/14(日)15:24 ID:ZqIkDajJ(5/8)
GoとLISPの区別もつかない人とはなあw
12: デフォルトの名無しさん [sage] 09/14(日)15:30 ID:ZqIkDajJ(6/8)
記事のスライス操作版のコードは

> // 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 {

とした方が良いな。
13
(1): デフォルトの名無しさん [sage] 09/14(日)15:35 ID:ZqIkDajJ(7/8) AAS
AA省
14: デフォルトの名無しさん [sage] 09/14(日)17:50 ID:ZqIkDajJ(8/8)
ChatGPTに下記の質問投げたらそこそこ納得できる回答くれたわ。

「Go言語は末尾再帰はサポートされてるの?」
「末尾再帰最適化されないところでの再帰呼び出しは引数の範囲が不定だとスタックがどれくらい使われるかの予測はしづらいので要はGoでは引数の範囲が不定なところでの再帰呼び出しは使わない方が無難てことですね。」
「関数型言語で育った人とかで「再帰は繰り返し処理より常に正義」とかって人いるじゃない。ああいう人にはGoは辛いかもですね。」
「Lispにloopがサポートされても意地でも使わないとかの人いましたね。」
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.359s*