快速递归调用

cas*_*las 2 swift

我对以下递归示例感到困惑。递归发生的地方,每次都需要更新局部变量。我想知道它如何存储基本结果?并且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)

Dou*_*son 5

我想知道它如何存储基本结果?而 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)