文字列snを連結して返す関数repeat(s:String、n:Int)を作成しようとしていますが、何らかの理由で正しい結果が得られず、尾の再帰的な、私は論理的に尾の再帰的ではない理由を把握するのに苦労している。このスカラー連結関数はなぜテール再帰的ではないのですか?
連結が完了する前に再帰処理が必要ですか?どうすれば問題を解決できますか?再帰を繰り返す(s + s、n-1)ことはうまくいかないかもしれませんが、何回他の方法で実行するのか分かりません。
/**
* Returns concatenated string s, concatenated n times
*/
@annotation.tailrec
def repeat(s: String, n: Int): String = n match {
case zero if (n == 0) => "" // zero repeats
case emptyString if (s == "") => throw new IllegalArgumentException("You must input a string") //no string exception
case fail if (n < 0) => throw new IllegalArgumentException("Cannot use a negative number") //throw exception
case last if (n == 1) => s
case concatenate => s + repeat(s, n-1) //tail-end recursion & concat.
}
PS:私は主にコードを最適化取得するために、とは対照的に、再帰を実践するためにこれをやっている
repeat' 'への再帰呼び出しの後に、より多くの仕事は、すなわち'のS +を返す前に行うことが残っているため、それがするのは簡単だ... ' –
末尾再帰ではありません'plus(s、repeat(s、minus(n、1))')関数形式で書くかどうかを見てください。 –