<h3>解决方案1。强力递归并删除重复项</h3>
<p>您可以使用<code>set</code>消除重复。<br/>
但是您不能对<code>list</code>进行<code>set</code>,因为<code>list</code>是不可散列的。<br/>
为了提高效率,您可以先收集索引对,然后切片:</p>
<pre class="lang-py prettyprint-override"><code>def num_sub_array(array):
return [
array[i:j] for i, j in build_pair_set(0, len(array))
]
def build_pair_set(start: int, end: int) -> set:
return set() if start == end else (
{(start, end)}
| build_pair_set(start + 1, end)
| build_pair_set(start, end - 1)
)
print(sorted(num_sub_array([1, 2, 3, 4])))
</code></pre>
<p>输出:</p>
<pre class="lang-py prettyprint-override"><code>[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
</code></pre>
<hr/>
<h3>解决方案2。无冗余递归</h3>
<pre class="lang-py prettyprint-override"><code>def num_sub_array(array):
if not array:
return []
return [array[i:] for i in range(len(array))] + num_sub_array(array[:-1])
print(sorted(num_sub_array([1, 2, 3, 4])))
</code></pre>
<p>输出:</p>
<pre class="lang-py prettyprint-override"><code>[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
</code></pre>
<hr/>
<p>实际上,解决方案2的<code>num_sub_array</code>有一个尾部递归。所以您可以将其更改为循环</p>
<h3>解决方案3。循环</h3>
<pre class="lang-py prettyprint-override"><code>def num_sub_array(array):
return [
array[i:j]
for i in range(len(array))
for j in range(i + 1, len(array) + 1)
]
print(sorted(num_sub_array([1, 2, 3, 4])))
</code></pre>
<p>输出:</p>
<pre class="lang-py prettyprint-override"><code>[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
</code></pre>
<hr/>
<p>我用<code>sorted</code>来比较两种方法。这是没有必要的</p>