代码之家  ›  专栏  ›  技术社区  ›  casillas

swift中的递归调用

  •  0
  • casillas  · 技术社区  · 5 年前

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

    我宁愿把问题处理如下。我想知道拥有上述解决方案的好处是什么。

    func digits(_ number:Int) -> [Int]
    {
        if number >= 10 {
            let lastDigit = number % 10
            return digits(number / 10) + [lastDigit]
        } else {
            return [number]
        }
    }
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Doug Richardson    5 年前

    我想知道它如何存储基本结果?让变量不可变,它是如何更新的?

    firstDigits 永不更改,只设置一次 每次调用 digits . 每次调用 数字 有它自己的变量。

    在下面的示例中,我将展示执行是如何作为一系列替换进行的。

    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]
    

    func digits(_ number:Int) -> [Int]
    {
        if number >= 10 {
            return digits(number / 10) + [number % 10]
        } else {
            return [number]
        }
    }