我目前正在学习LinkedLists和递归,但是我很难理解下面的代码(函数partitions(n,m))。
在本教科书中,链接列表以(第一,其余)对的形式给出。并且此函数正在尝试计算使用最大为m的部分对整数n进行划分的方法的数量。
>>> def partitions(n, m):
"""Return a linked list of partitions of n using parts of up to m.
Each partition is represented as a linked list.
"""
if n == 0:
return link(empty, empty) # A list containing the empty partition
elif n < 0 or m == 0:
return empty
else:
using_m = partitions(n-m, m)
with_m = apply_to_all_link(lambda s: link(m, s), using_m)
without_m = partitions(n, m-1)
return extend_link(with_m, without_m)
>>> def apply_to_all_link(f, s):
"""Apply f to each element of s."""
assert is_link(s)
if s == empty:
return s
else:
return link(f(first(s)), apply_to_all_link(f, rest(s)))
>>> def extend_link(s, t):
"""Return a list with the elements of s followed by those of t."""
assert is_link(s) and is_link(t)
if s == empty:
return t
else:
return link(first(s), extend_link(rest(s), t))
我不明白的是为什么在else语句中我们在using_m上使用apply_to_all_link,但是在不使用m的情况下不这样做,而是将分区应用于n和m -1直接。我想一个更基本的问题是,我不确定lambda函数到底在做什么,尽管我认为我知道它是在分区m之外创建一个LinkedList并递归调用n-m。为什么我们不能只用with_m = partitions(n-m,m)和without_m = partitions(n,m-1)并返回extend_link(with_m,Without_m)?
请让我知道代码的任何部分是否需要进一步说明和感谢。