python 递归,这样做正确吗?[已关闭]

bsxbgnwa  于 2023-01-16  发布在  Python
关注(0)|答案(3)|浏览(127)

4小时前关门了。
Improve this question

def slice_num(num, lst=None):
    if lst is None:
        lst = []
    if num > 0:
        lst.append(num % 10)
        slice_num(num//10, lst)
    return lst[::-1]

print(slice_num(564))

需要使用递归。从数字中生成一个数字列表是正确的选择吗?

6xfqseft

6xfqseft1#

您的尝试似乎不错。另一种选择是修改答案递归提取数字:

  • 避免需要修改的额外参数
  • 较短(单行),因此可能更简单
    备选
def slice_num(n):
    return [n] if n < 10 else slice_num(n // 10) + [n % 10]
3bygqnnd

3bygqnnd2#

你所需要做的就是颠倒lst.append和递归调用的顺序,这样,在把 * 余数 * 加到列表末尾之前,* 商 * 就变成了一个数字列表,这样,你就不需要在返回它之前颠倒列表的顺序了。

def slice_num(num, lst=None):
    if lst is None:
        lst = []
    if num > 0:
        slice_num(num//10, lst)
        lst.append(num % 10)

    return lst

有很多方法可以简化这个过程。
1.您可以通过一次调用获得商和余数:

def slice_num(num, lst=None):
    if lst is None:
        lst = []
    if num > 0:
        q, r = divmod(num, 10)
        slice_num(q, lst)
        lst.append(r)
    return lst

1.将其分为两个功能:一个递归函数,它在适当的位置修改lst,但不返回它;以及一个 Package 器,它 * 只 * 接受一个数字,并确保最初用一个空列表调用帮助器。

def slice_num(num: int) -> [int]:
    lst = []
    _slice_helper(num, lst)
    return lst

def _slice_helper(num: int, lst: list[int]) -> None:
    if num > 0:
        q, r = divmod(num, 10)
        _slice_helper(q, lst)
        lst.append(r)

这遵循Python的约定,即 * 要么 * 修改列表 * 要么 * 返回修改后的值,而不是两者。
1.请注意,您可以使用divmodfirst,并使用q == 0作为基本情况,这样您就可以无条件地将r追加到列表中,就像q == 0 then r == num一样,它还消除了递归调用_slice_helper(0, lst)

def _slice_helper(num, lst):
    q, r = divmod(num, 10)
    if q > 0:
        _slice_helper(q, lst)
    lst.append(r)
inb24sb2

inb24sb23#

如果你仍然坚持使用递归,尽管从评论中给出的建议,这里有一个简单的方法:

def slice_num(num):
    if num < 0:
        num = -num
    if num == 0:
        return []
    else:
        return slice_num(num // 10) + [num % 10]

print(slice_num(564))

你甚至可以使用一行代码,只要理解上面的代码做什么:

def slice_num(num):
    return slice_num(num // 10) + [num % 10] if num else []
    
print(slice_num(564))

两种方法将产生相同的输出。
输出:

[5, 6, 4]

相关问题