我的问题有两个:
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])
?
答案 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