CodeSignal的reverseInParentheses题解单次调用方法却多次执行的原因
问题解答
这是编程语言通用的递归调用基础特性,和CodeSignal平台、Main方法特殊机制无关,你使用的C#本身完全支持该语法,在Unity开发环境中也可以正常使用。
你之所以产生只显式调用一次的误解,是因为仅注意到了reverseInParentheses方法内的一次调用,漏看了reverse方法末尾的自调用逻辑:
string reverseInParentheses(string s) { return reverse(s); } string reverse(string s) { var l = s.LastIndexOf('('); if (l == -1) return s; var r = s.IndexOf(')', l); var arr = s.Substring(l + 1, r - l - 1).ToCharArray(); Array.Reverse(arr); // 此处reverse方法调用了自身,会触发多次执行 return reverse(s.Substring(0, l) + new string(arr) + s.Substring(r + 1)); }
该方法的执行逻辑是:每次处理完一对括号的反转后,就会把处理后的新字符串传入自身再次执行,直到字符串中不存在括号才会停止,因此有效处理括号的执行次数和输入的括号对数完全匹配:
- 输入
(bar)时:第一次执行reverse反转得到rab,再次调用reverse时找不到左括号直接返回,总执行次数为1次 - 输入
foo(bar)baz(blim)时:第一次执行reverse优先处理最右侧的(blim)得到中间字符串foo(bar)bazmilb,触发第二次reverse调用处理剩余的(bar)得到foorabbazmilb,第三次调用reverse无括号直接返回,有效处理括号的执行次数刚好为2次
递归是通用的编程逻辑,不受运行环境限制,你在Unity开发中也可以用相同写法处理嵌套结构的业务需求。
内容的提问来源于stack exchange,提问作者Kcin41
相关产品推荐
相关产品推荐

