Chage python递归类型

问题描述 投票:0回答:1

这是我正在写的一个示例json扩展递归:

data = {
    'name': 'randy smith',
    'age': 20,
    'address': {
        'street': '13301 parkwood',
        'city': 'new york',
        'state': 'ny',
        'zip': 20039
    }
}

def expand_json(data, prefix='', expanded_data={}):
    for key in data:
        # base case is when the structure is not a dict or array
        if not isinstance(data[key], (list, dict)):
            expanded_data[prefix + key] = data[key]
        else:
            expand_json(data[key], prefix=key + '.', expanded_data=expanded_data)
    return expanded_data
>> expand_json(data)
{'name': 'randy smith', 'age': 20, 'address.street': '13301 parkwood', 'address.city': 'new york', 'address.state': 'ny', 'address.zip': 20039}

此函数使用哪种类型的递归:例如线性或尾部? (或其他?)将其重写为使用另一种“递归”类型的示例是什么?

python algorithm recursion tail-recursion
1个回答
0
投票

例如,如果您直接返回递归的值,则只有尾递归

return expand_json(...)

如果在递归调用返回后执行其他任何操作,则为普通的递归。

由于您在进行递归调用后继续执行for循环,因此显然不是尾递归。

请注意,您的代码还有另一个问题。您不应该在参数列表中使用expanded_data = {}。参见"Least Astonishment" and the Mutable Default Argument。初始化如下:

def expand_json(data, prefix='', expanded_data=None):
    if expanded_data is None:
        expanded_data = {}
    for key in data:
        # base case is when the structure is not a dict or array
        if not isinstance(data[key], (list, dict)):
            expanded_data[prefix + key] = data[key]
        else:
           expand_json(data[key], prefix=key + '.', expanded_data=expanded_data)
    return expanded_data
© www.soinside.com 2019 - 2024. All rights reserved.