我对以下递归示例感到困惑。递归发生的地方,每次都需要更新局部变量。我想知道它如何存储基本结果?并且let变量不是可变的,它如何更新?
以下解决方案的问题如下:
实现一个名为digits 的递归函数,它接受一个正整数并按顺序返回一个包含它的数字的数组。
函数调用:
数字(123)
函数输出:
[1, 2, 3]
func digits(_ number:Int) -> [Int]
{
if number >= 10 {
// confusion in the following line
let firstDigits = digits(number / 10)
let lastDigit = number % 10
return firstDigits + [lastDigit]
} else {
return [number]
}
}
Run Code Online (Sandbox Code Playgroud)
我宁愿按以下方式处理问题。我想知道拥有上述解决方案的优点是什么。
func digits(_ number:Int) -> [Int]
{
if number >= 10 {
let lastDigit = number % 10
return digits(number / 10) + [lastDigit]
} else {
return [number]
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道它如何存储基本结果?而 let 变量是不可变的,它是如何更新的?
firstDigits永远不会改变,它只在每次调用时 设置一次digits。每次调用digits都有它自己的变量。
在下面的例子中,我展示了 execute 是如何作为一系列替换进行的。
digits(123) ->
digits(123 / 10) + [123 % 10] ->
digits(12) + [3] ->
digits(12 / 10) + [12 % 10] + [3] ->
digits(1) + [2] + [3] ->
[1] + [2] + [3] ->
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
digits(123) ->
digits(123 / 10) + [123 % 10] ->
digits(12) + [3] ->
digits(12 / 10) + [12 % 10] + [3] ->
digits(1) + [2] + [3] ->
[1] + [2] + [3] ->
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |