楔子
学习《go语言程序设计》 所做的笔记
5 过程式编程
5.6.4 递归函数|回文
书中这段判断一个字符串是否是回文感觉代码写的特别好,因此做个记录,受到这个启发,写了字符串反转的例子
// 使用递归判断是否是回文
func IsPlindrome(word string) bool {
//获取字符串长度|(len函数获取的字符串字节数)
if utf8.RuneCountInString(word) <= 1 {
return true
}
//返回字符串的第一个字符(rune类型)和它占用的字节数
first, sizeOfFirst := utf8.DecodeRuneInString(word)
last, sizeOfLast := utf8.DecodeLastRuneInString(word)
if first != last {
return false
}
return IsPlindrome(word[sizeOfFirst : len(word)-sizeOfLast])
}
函数的第一部分是一个跳出条件:如果单词的长度为0或者1,那么就认为这是一个回文。函数整体算法时比较首字母和尾字母,如果不同,不是回文返回false。如果相同,就递归判断这个单词的一个字串
当一个函数使用尾递归(最后执行一句递归调用),这种情况可以简单地 将他转换成一个循环,使用循环的好处是可以
减少递归调用的开销,因为有限的空间栈对函数的深度递归是很有影响的。
受到上面启发,写的字符串反转函数
//受到上面判断回文写的字符串反转
func MyReverse(str string) string {
strSlice := make([]rune, 0)
for len(str)>0 {
sts, sizeOfLast := utf8.DecodeLastRuneInString(str)
strSlice = append(strSlice, sts)
//截取掉最后一个字符
str = str[:len(str)-sizeOfLast]
}
return string(strSlice)
}
"github.com/huandu/xstrings"中字符串反转
// Reverse a utf8 encoded string.
func Reverse(str string) string {
var size int
tail := len(str)
buf := make([]byte, tail)
s := buf
for len(str) > 0 {
_, size = utf8.DecodeRuneInString(str)
tail -= size
s = append(s[:tail], []byte(str[:size])...)
str = str[size:]
}
return string(buf)
}