变量范围和数字函数

时间:2014-09-18 11:22:24

标签: syntax scope julia

我的问题有两个:

1)据我所知,像for循环这样的结构引入了作用域块,但是我在一个在所述构造之外定义的变量时遇到了一些麻烦。以下代码描述了尝试从数字中提取数字并将它们放在数组中。

n = 654068
l = length(n)
a = Int64[]
for i in 1:(l-1)
    temp = n/10^(l-i)
    if temp < 1 #  ith digit is 0
        a = push!(a,0)
    else # ith digit is != 0
        push!(a,floor(temp))
        # update n
        n = n - a[i]*10^(l-i)
    end
end
# last digit
push!(a,n)

代码执行正常,但是当我查看a数组时,我得到了这个结果

julia> a
0-element Array{Int64,1}

我认为for循环中发生的任何事情都是外部看不到的,除非我在for循环外定义的变量上运行。此外,我认为通过使用!语法,我将直接在a上运行,但事实并非如此。如果有人能向我解释这是如何工作的,将不胜感激:)

2)第二个问题是关于解释函数时使用的syntex。显然有一个叫做数字的函数,它使用我得到的帮助函数从数字中提取数字并将它们放入数组中

julia> help(digits)
Base.digits(n[, base][, pad])
   Returns an array of the digits of "n" in the given base,
   optionally padded with zeros to a specified size. More significant
   digits are at higher indexes, such that "n ==
   sum([digits[k]*base^(k-1) for k=1:length(digits)])".

任何人都可以向我解释如何解释Julia中有关函数的信息。我如何解释digits(n[, base][, pad])?如何正确调用数字函数?我不能这样:digits(40125[, 10])

2 个答案:

答案 0 :(得分:1)

我无法重现你的结果,运行你的代码给了我

julia> a
1-element Array{Int64,1}:
 654068

代码中存在一些错误和效率低下:

  • length(n)未给出n中的位数,但始终返回1(当前,数字是可迭代的,并返回仅包含一个数字的序列;本身)。所以for循环永远不会运行。
  • 整数之间的
  • /进行浮点除法。对于提取数字,最好使用div(x,y)进行整数除法。
  • 没有理由写a = push!(a,x),因为push!会修改a。所以它等同于写push!(a,x); a = a
  • 没有理由将数字专门设为零,一般情况下它们处理得很好。

您对朱莉娅的范围界定的描述似乎是正确的,我认为上面的内容会给您带来麻烦。

您可以使用类似

的内容
n = 654068
a = Int64[]
while n != 0
    push!(a, n % 10)
    n = div(n, 10)
end
reverse!(a)

此循环以相反的顺序提取数字以避免必须提前计算出位数,并使用模数运算符%来提取最低有效位。然后使用reverse!按照您想要的顺序获取它们,这应该非常有效。

关于digits的文档,[, base]仅表示base是可选参数。说明应该是digits(n[, base[, pad]]),因为除非您指定pad,否则无法指定base。另请注意,digits将首先返回最低有效数字,如果我们从上面的代码中删除reverse!,我们会得到什么。

答案 1 :(得分:0)

这是作弊吗?:

n = 654068
nstr = string(n)
a = map((x) -> x |> string |> int , collect(nstr))

输出:

6-element Array{Int64,1}:
6
5
4
0
6
8