Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 链表和递归问题理解代码_Python_Function_Recursion_Lambda_Linked List - Fatal编程技术网

Python 链表和递归问题理解代码

Python 链表和递归问题理解代码,python,function,recursion,lambda,linked-list,Python,Function,Recursion,Lambda,Linked List,我目前正在学习LinkedList和递归,但我很难理解下面的代码(函数分区(n,m)) 在这本教科书中,LinkedList是以(第一,其余)对的形式给出的。这个函数试图计算用大小不超过m的部分划分整数n的方法的数量 >>> def partitions(n, m): """Return a linked list of partitions of n using parts of up to m. Each partition i

我目前正在学习LinkedList和递归,但我很难理解下面的代码(函数分区(n,m))

在这本教科书中,LinkedList是以(第一,其余)对的形式给出的。这个函数试图计算用大小不超过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))
def分区(n,m): “”“返回n个分区的链接列表,使用最多m个分区的部分。 每个分区都表示为一个链表。 """ 如果n==0: 返回链接(空,空)#包含空分区的列表 如果n<0或m==0: 返回空 其他: 使用_m=分区(n-m,m) with_m=将_应用于_all_链接(lambda s:link(m,s),使用_m) 无_m=分区(n,m-1) 返回扩展链接(有、无) >>>def应用到所有链接(f,s): “”“将f应用于s的每个元素。” 断言是链接 如果s==空: 返回s 其他: 返回链接(f(第一个),应用到所有链接(f,其余) >>>def扩展_链接(s,t): “”“返回一个列表,其中元素s后跟元素t。” 断言是链接(s)和是链接(t) 如果s==空: 返回t 其他: 返回链接(第一个链接、延伸链接(其余链接、t)) 我不明白的是,为什么在else语句中,我们会在使用m时使用apply_to_all_链接,但对于不使用m的情况,我们不会这样做,而是直接将分区应用于n和m-1。我想一个更基本的问题是我也不确定lambda函数到底在做什么,尽管我想我知道它在用分区m创建一个LinkedList,并递归调用n-m。为什么我们不能只使用with_m=分区(n-m,m)和with_m=分区(n,m-1)并返回extend_link(with_m,with_m)

请让我知道,如果任何部分的代码需要更多的澄清和提前感谢