<p>如果你真的想要一个递归风格的函数。我不知道它是否更优雅,但我知道它比命令式(递归限制和尾部调用)更不有效,也更受限制:</p>
<pre><code>from collections import defaultdict
'''
Return the "biggest" key (assuming keys are int).
Should've used a ordered set instead of a dict
'''
def maxkey(dictio):
return max ([ int(k) for k in dictio.keys() ])
'''
Recursion-style of findmax. Notice the call to the same input string minus the first element,
which indicate that the recursion isn't really much more efficient than imperative style.
Also we have to take the maximum recursion limit into account (which should be attained in practice.)
'''
def findmax( input_string , tempbuffer = defaultdict(list), temp = '' ):
# End of the recursion
if len(input_string) == 0:
tempbuffer[len(temp)].append(temp) # add last element
output = tempbuffer[maxkey(tempbuffer)] # return the set of longest elements
tempbuffer.clear() # pesky little mutable objects ...
return output
# Still elements in the input string
else:
first_char = input_string[0]
# still ascending : buffering
if len(temp) == 0 or first_char > temp[-1]:
temp = temp + first_char
# new string : store the old one
else:
tempbuffer[len(temp)].append(temp)
temp = first_char
# Recursion call on the 'tail' of the input string, one character at a time
return findmax( input_string[1:],tempbuffer, temp)
if __name__ == '__main__' :
print findmax('abczabc')
print findmax('abcabd')
</code></pre>