<p>有许多相互交织的问题需要解决。这两个函数的命名令人困惑。如果我们遵循逻辑,那么函数<code>increasing()</code>应该被称为<code>nondecreasing()</code>,同样地,函数<code>decreasing()</code>应该被称为<code>nonincreasing()</code>。它是>;(大于)和>;=(大于或等于)之间的差值。你知道吗</p>
<p>下一个混淆是这些函数接受和返回的类型是什么?如果我们检查<em>working</em><code>increasing()</code>函数返回的内容,我们会得到:</p>
<pre><code>str return "1"*(length+1)
int return int(n)+1
int return int(str(firstcharacter)*length)
str return firstcharacter+str(increasing(int(asastring[1:])))
str return str(int(firstcharacter)+1) * len(str(n))
str return firstcharacter+str(increasing(int(asastring[1:])))
</code></pre>
<p>如果我们类似地观察<code>increasing()</code>如何处理它自己的内部递归调用,看看它认为它接受和返回什么,我们会得到:</p>
<pre><code>int -> int return firstcharacter+str(increasing(int(asastring[1:])))
int -> int return firstcharacter+str(increasing(int(asastring[1:])))
</code></pre>
<p>所以这里有一个<code>increasing()</code>的尝试性修改,也就是<code>nondecreasing()</code>,它试图使它一致地接受<code>int</code>并返回<code>int</code>:</p>
<pre><code>def nondecreasing(n): # aka increasing()
as_string = str(n)
length = len(as_string)
if as_string == "9" * length:
return int("1" * (length + 1))
if length == 1:
return int(n) + 1
first_digit, second_digit, second_digit_onward = as_string[0], as_string[1], as_string[1:]
if first_digit > second_digit:
return int(first_digit * length)
if first_digit == second_digit:
return int(first_digit + str(nondecreasing(int(second_digit_onward))))
if as_string == first_digit + "9" * (length - 1):
return int(str(int(first_digit) + 1) * length)
return int(first_digit + str(nondecreasing(int(second_digit_onward))))
</code></pre>
<p><code>decreasing()</code>,也就是<code>nonincreasing()</code>,函数的问题更大。它依赖于在内部调用时接受<code>int</code>或<code>str</code>的能力来解决问题。你知道吗</p>
<p>讨论这类问题,而不是让其他程序员重新发现它们,是代码注释的全部内容。你知道吗</p>
<p>我不认为上述问题排除了<code>nonincreasing()</code>持续返回<code>int</code>:</p>
<pre><code>def nonincreasing(n): # aka decreasing()
as_string = str(n)
length = len(as_string)
if as_string == "9" * length:
return int("1" + "0" * length)
if length == 1:
return int(n) + 1
first_digit, second_digit, second_digit_onward = as_string[0], as_string[1], as_string[1:]
if first_digit > second_digit:
return int(first_digit + str(nonincreasing(second_digit_onward)))
if first_digit == second_digit:
remaining_digits = str(nonincreasing(second_digit_onward))
second_digit = remaining_digits[0]
n = first_digit + remaining_digits
if first_digit < second_digit:
return int(str(int(first_digit) + 1) + '0' * (length - 1))
return int(n)
</code></pre>
<p>修复此函数的关键是从倒数第二个<code>if</code>子句中删除<code>return</code>语句,改为修复数据并让它进入下一个<code>if</code>子句,以查看结果是否需要修复。你知道吗</p>
<p>我相信@devender22对<code>int()</code>转换的理解是至关重要的,但我不相信伴随的解决方案是有效的,因为它会产生大量不正确的结果(例如,990到998都会变成1000,而它们只需加1)。你知道吗</p>
<p>为了检查我的<code>nonincreasing()</code>函数的所有情况,我编写了一个效率较低的非递归解决方案,没有单独的情况,使用完全不同的Python操作符:</p>
<pre><code>def nonincreasing(n):
def is_increasing(n):
string = str(n)
return any(map(lambda x, y: y > x, string, string[1:]))
while is_increasing(n + 1):
n += 1
return n + 1
</code></pre>
<p>然后确保两个实现的输出一致。你知道吗</p>