Go语言程序设计学习

楔子

学习《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)
}

发布了308 篇原创文章 · 获赞 70 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/u012848709/article/details/104585202