3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

文字を逆順にする再帰関数の良い作り方

Last updated at Posted at 2020-12-21

#文字を逆順に表示する為の考え方

  1. 特定の単語の最後の値を取得する
  2. 既存単語の最後の値を削除する
  3. 2の後の単語の最後の値を取得し1の取得した文字の後につなげる
  4. 1~3を単語の文字数がぜろになるまで繰り返す
  5. 取得した文字を出力

#完成コード

test.php
<?php
    function reverseStr($word,$reword){
        if(strlen($word)<1){
            return $reword;
        }
        return reverseStr(substr($word,0,-1), $reword.$word[-1]);
    }
    $word = "abcdefgh";
    echo reverseStr($word, null);
    //hgfedcba
    echo strlen("");
    //0
?>

#コードの解説
再帰関数にも色々種類があるが、末尾再帰を意識して作成している。
このことについて、通常の再帰関数との違いを比較しながら解説を行っていく。

####末尾再帰の場合
前提条件:入力値をabcdとする

test.php
<?php
    function a($word,$reword){
        if(strlen($word)<1){
            return $reword;
        }
        return a(substr($word,0,-1), $reword.$word[-1]);
    }
?>

解説

初期の入力値が(abcd,"")だった場合に想定される関数の遷移は下記のようになる
a(abcd,"")
=> a(abc,d)
=> a(ab,dc)
=> a(a,dcb)
=> a("",dcba)
=> dcba
1つずつ値を返して処理を実行するのでメモリへの負担が少ないことが言える。

####通常の再帰の場合
前提条件:入力値をabcdとする

test.php
<?php
   function a($word){
        if(strlen($word)<1){
            return $word;
        }
        return $word[-1] + a(substr($word,0,-1));
    }
?>

解説

初期の入力値が(abcd,"")だった場合に想定される関数の遷移は下記のようになる
a(abcd)
=> a(abcd){ d + a(abc) }
=> a(abcd){ d + a(abc) { c + a(ab) } }
=> a(abcd){ d + a(abc) { c + a(ab) { b + a(a) } } }
=> a(abcd){ d + a(abc) { c + a(ab) { b + a } } }
=> a(abcd){ d + a(abc) { c + ba } }
=> a(abcd){ d + cba }
=>dcba

#現在解説を修正中です。

#他言語のコード(参考までに)

test.js
  function reverseStr(word, reword){
      if(word.length < 1){
          return reword;
      }
      return reverseStr(word.slice(0,-1), reword + word.slice(-1));
  }
  var word = "abcdefgh";
  console.log(reverseStr(word, ""));
test.rb
def reverseStr(word, reword)
   if(word.length < 1)
       return reword
   end
   return reverseStr(word[0..-2],reword+word[-1])
end
word = "abcdefgh"
puts reverseStr(word, "")
test.py
def reveseStr(word, reword):
    if len(word) < 1:
        return reword
    return reveseStr(word[0:-1], reword + word[-1])
    
word = "abcdefgh"
print(reveseStr(word, ""))
3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?