def digits(n):
res = []
while n > 0:
res.append(n % 10)
n /= 10
return res
我想重写这个函数,所以它使用递归。我现在迷失了该做什么。谁能给我一些方向?
答案 0 :(得分:6)
要创建递归函数,您需要确定两件事:
1)基本情况 - 您想要停止递归的条件
2)一般情况 - 在每个输入上做什么,但基本情况
你已经找到了这两件事,基本情况是while循环条件,一般情况是while循环的内部。尝试使用此信息继续前进。
答案 1 :(得分:2)
这是一个可能的解决方案:
def digits(n):
if n < 10:
return [n]
return digits(n/10) + [n%10]
digits(123)
> [1, 2, 3]
上述解决方案修复了代码中的错误,您以相反的顺序返回数字。另请注意,n
必须是大于或等于零的整数才能生成正确的结果。
以下是它的工作原理:
digits
- 即没有最后一个数字的数字我们刚刚处理的数字。 digits(123)
的调用在递归的每一步都是这样的:
digits(123) = digits(123/10) + [3]
digits(12) = digits(12/10) + [2]
digits(1) = [1]
现在我们进入调用堆栈:
[1]
[1] + [2]
[1, 2] + [3]
[1, 2, 3]
编辑:
接受@ thg435的挑战,这是一个尾递归解决方案:
def digits(n):
def loop(i, acc):
if i < 10:
return [i] + acc
return loop(i/10, [i%10] + acc)
return loop(n, [])
答案 2 :(得分:0)
当你使用递归时,一个很好的基础是要检查两个案例,一个基本案例和一个递归案例。基本情况是程序返回的条件和结果,在您的情况下,基本情况是当n> 1时。 0(如果你认为它像while循环一样,那就是while循环退出的条件)。循环未完成时会发生递归情况(可能有多个),如果你比较一个while循环,这基本上就是循环的主体。在递归情况结束时,您需要使用对输入的更改再次调用该函数,在本例中为n / 10.
因此,您的函数定义类似于:
def digits(n):
对于基本情况,您要检查n是否为0,如果是,则返回空列表:
if n <= 0:
return []
现在,在递归的情况下,你想要将n%10附加到列表并再次调用你的函数,只是你想用不同的n调用它,改变你在while循环中的颜色:
else:
return [n%10]+digits(n/10)
所以,如果你追踪这个,对于每个递归的情况,你得到一个包含n%10的列表,然后它添加新调用的结果,它将是(n / 10)%10或空列表。例如,运行n = 100的此函数会像这样分解:
newlist = digits(100)
newlist = [100%10]+digits(100/10)
newlist = [100%10]+([10%10] + digits(10/10))
newlist = [100%10]+([10%10] + ([1%10] + digits(10/10)))
newlist = [100%10]+([10%10] + ([1%10] + ([])))
newlist = [0,0,1]
嵌套的parens用于显示函数数字如何内联重写。
答案 3 :(得分:0)
def digits(n):
res = []
res.append(n%10)
n /= 10
if n != 0:
return res + digits(n)
else:
return res