gpt4 book ai didi

recursion - 在 Julia 中理解没有基本情况的递归

转载 作者:行者123 更新时间:2023-12-03 23:48:55 25 4
gpt4 key购买 nike

此片段来自 Rational Numbers 的实现在 Julia :

# Rational.jl
# ...
Rational{T<:Integer}(n::T, d::T) = Rational{T}(n,d)
Rational(n::Integer, d::Integer) = Rational(promote(n,d)...)
Rational(n::Integer) = Rational(n,one(n))

//(x::Rational, y::Integer) = x.num // (x.den*y) <--- HERE!

# ...

看看 // 如何函数被实现然后与中缀表示法一起使用?这实际上是如何返回值的?

当我看到这段代码时,我是这样解释的:
  • //使用 Rational 和 Integer 调用函数。
  • 但随后它进行了没有其他参数的递归调用。

  • #2是真正让我感到困惑的一个。数据结构中的递归在哪里结束? //如何如果它不断评估什么,则返回一个值?

    请帮助我理解这一点。

    最佳答案

    这是因为 Julia 最基本的特性之一:多重分派(dispatch)。在 Julia 中,函数可以有许多方法适用于参数类型的各种组合,当您调用函数时,Julia 会调用与您调用它的所有参数类型匹配的最具体的方法。 //在您发布的方法定义中调用定义有理整数 //整数整数 // - 所以它实际上不是递归的,因为该方法不会调用自身,它调用的是同一个“通用函数”的不同方法。

    为了理解在这种情况下多分派(dispatch)是如何工作的,让我们考虑表达式 (3//4)//6 的计算。 .我们将使用 @which宏来查看每个函数调用调用的方法。

    julia> @which (3//4)//6
    //(x::Rational{T<:Integer}, y::Integer) at rational.jl:25

    由于 3//4Rational{Int} <: Rational6Int <: Integer ,并且没有其他更具体的方法适用,此方法称为:
    //(x::Rational, y::Integer) = x.num // (x.den*y)

    current version该方法实际上比您发布的稍微复杂一些,因为它已经过修改以检查整数溢出 - 但它本质上是相同的,并且更容易理解旧的、更简单的版本,所以我会使用它。让我们分配 xy到参数并查看定义调用的方法:
    julia> x, y = (3//4), 6
    (3//4,6)

    julia> x.num
    3

    julia> x.den*y
    24

    julia> x.num // (x.den*y)
    1//8

    julia> @which x.num // (x.den*y)
    //(n::Integer, d::Integer) at rational.jl:22

    如你所见,这个表达式调用的不是同一个方法,它调用了 different method :
    //(n::Integer,  d::Integer) = Rational(n,d)

    此方法只需调用 Rationaln 的比率放入的构造函数和 d成最低的条款并创建一个 Rational数字对象。

    在 Julia 中,根据同一函数的另一种方法来定义一个函数的一种方法是很常见的。例如,这就是参数默认值的工作方式。考虑这个定义:
    julia> f(x, y=1) = 2x^y
    f (generic function with 2 methods)

    julia> methods(f)
    # 2 methods for generic function "f":
    f(x) at none:1
    f(x, y) at none:1

    julia> f(1)
    2

    julia> f(2)
    4

    julia> f(2,2)
    8

    默认参数语法只是生成第二个方法,只有一个参数,它调用具有默认值的双参数形式。所以 f(x, y=1) = 2x^y完全等同于定义两个方法,其中一元方法只调用二元方法,为第二个参数提供默认值:
    julia> f(x, y) = 2x^y
    f (generic function with 1 method)

    julia> f(x) = f(x, 1)
    f (generic function with 2 methods)

    关于recursion - 在 Julia 中理解没有基本情况的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079146/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com