链表和递归问题理解代码

时间:2020-10-23 10:22:06

标签: python function recursion lambda linked-list

我目前正在学习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)?

请让我知道代码的任何部分是否需要进一步说明和感谢。

0 个答案:

没有答案