擅长:python、mysql、java
<p>基于Haskell的解决方案,我在这个问题上发表了一个评论,下面是一个使用<code>itertools</code>库的解决方案,它使用了一个无限的值列表。你知道吗</p>
<pre><code>import itertools
def pay(n, a, b, k):
cyc = itertools.cycle([range(a, b+1, k), range(b, a-1, -k)])
chained = itertools.chain.from_iterable(cyc)
return sum(itertools.islice(chained, n))
</code></pre>
<p>这是因为我们用这个算法封装的模式是无限循环模式<code>[range(a, b+1, k), range(b, a-1, -k)]</code>(遍历<code>k</code>从<code>a</code>到<code>b</code>,然后遍历<code>-k</code>从<code>b</code>到<code>a</code>)。<code>itertools.chain.from_iterable</code>从单个<code>range</code>迭代器中提取,并且<code>islice</code>确保我们只获取<code>n</code>的结果。你知道吗</p>
<p><code>cyc</code>和<code>chained</code>是无穷级数,而<code>islice</code>正做着限制<code>n</code>学生的工作。你知道吗</p>