#文字を逆順に表示する為の考え方
- 特定の単語の最後の値を取得する
- 既存単語の最後の値を削除する
- 2の後の単語の最後の値を取得し1の取得した文字の後につなげる
- 1~3を単語の文字数がぜろになるまで繰り返す
- 取得した文字を出力
#完成コード
<?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とする
<?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とする
<?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
#現在解説を修正中です。
#他言語のコード(参考までに)
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, ""));
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, "")
def reveseStr(word, reword):
if len(word) < 1:
return reword
return reveseStr(word[0:-1], reword + word[-1])
word = "abcdefgh"
print(reveseStr(word, ""))