我的目标是以递归方式编写所有函数,以便让我看起来更聪明.为了好玩,我想出了一个字符串比较功能
#includeint string_compare ( char * s1, char * s2 ) { int retval; switch ( s1 ? 1 : 0 + s2 ? 2 : 0 ) { case 0 : retval = 1; break; case 1 : case 2 : retval = 0; break; case 3 : retval = *s1 == *s2 ? string_compare(++s1,++s2) : 0; break; } return retval; } int main ( ) { char str1 [] = "hey there", str2 [] = "hey there"; std::cout << string_compare(str1,str2); }
但这是错误的,因为上面的代码是打印0
而不是期望1
.有什么问题?
运算符+
优先于运算符?:
.使用括号.
switch ( (s1 ? 1 : 0) + (s2 ? 2 : 0) )
对于完整的,有效的C字符串递归比较函数,这是一个实现:
/// @retval -1 iff sting s1 is before s2 /// @retval 0 iff sting s1 is equal to s2 /// @retval +1 iff sting s1 is afters2 int string_compare(const char* s1, const char* s2) { if (*s1 > *s2) return 1; if (*s1 < *s2) return -1; if (*s1 == 0) return 0; // *s1 == *s2 == '\0' return string_compare(++s1, ++s2); }
我们的想法是将结果定义为递归语句:
空字符串小于任何非空字符串;
如果两个s1
和s2
是空的,s1 == s2
;
如果第一个字符s1
小于其中一个s2
,s1 < s2
;
如果第一个字符s1
大于s2
,则s1 > s2
;
如果第一个字符s1
是相等的一个s2
,,
的顺序S1
和s2
相同的字符串的顺序,采取了他们的第一个字符.
#include#include namespace { int string_compare(const char* s1, const char* s2) { if (*s1 > *s2) return 1; if (*s1 < *s2) return -1; if (*s1 == 0) return 0; // *s1 == *s2 == '\0' return string_compare(++s1, ++s2); } } int main() { const char* words[] = { "recursive", "compare", "function", "for", "C", "string", "is", "really", "useless", "dont", "you", "think", " ", "recursive" }; std::sort(std::begin(words), std::end(words), [](auto lhs, auto rhs){ return string_compare(lhs, rhs) < 0;}); for (auto s : words) std::cout << s << std::endl; }
C compare dont for function is really recursive recursive string think useless you
Demo
使用父母(并修复条件):
(*s1 ? 1 : 0) + (*s2 ? 2 : 0)