Julia 朱莉娅:把向量转换成以n为基数的数字
我需要一个函数,它将整数向量解释为具有特定基数的数字,如下所示:Julia 朱莉娅:把向量转换成以n为基数的数字,julia,Julia,我需要一个函数,它将整数向量解释为具有特定基数的数字,如下所示: vectonum([1,2,3,4], 10) #=> 1234 vectonum([0,0,0,1], 2) #=> 1 vectonum([1,1,1,1], 2) #=> 15 以下函数可以完成这项工作,但在我看来有点笨拙: function vectonum(vector, base) result = 0 vector = reverse(vector) for (idx, val) in
vectonum([1,2,3,4], 10) #=> 1234
vectonum([0,0,0,1], 2) #=> 1
vectonum([1,1,1,1], 2) #=> 15
以下函数可以完成这项工作,但在我看来有点笨拙:
function vectonum(vector, base)
result = 0
vector = reverse(vector)
for (idx, val) in enumerate(vector)
val_ = val * base ^ (idx - 1)
result += val * base ^ (idx - 1)
end
return result
end
是否有更好、更具julia风格的方法来实现这一点,甚至可能有内置的函数或模块
提前谢谢 你可以写:
f(v, b) = foldl((x,y) -> b*x+y, v)
这可能是最短最快的。在调用中将其更改为foldl((x,y)->b*x+y,v,init=0)
,如果您希望它也适用于空向量返回0
我也想到了一些选择,所以我把它们贴在下面
首先,相对较短(不是很快)的方法是:
f(v, b) = parse(Int, join(v), base=b)
在您的实施过程中会有以下内容:
f(v, b) = sum(x -> b^(x[1]-1)*x[2], enumerate(Iterators.reverse(v)))
你写的绝对是朱莉娅的风格。你只是选择了一个稍微低效的算法。最好避免求幂,因为这是一个昂贵的操作,在这里需要做大量的冗余工作(在一次迭代中计算
b^n
,然后在下一次迭代中计算b^(n+1)
,显然效率低下。)
这里的实现与@BogumilKaminski的第一个解决方案基本相同,只是作为循环编写(循环是Julia风格的),显然也比使用foldl
稍微快一点:
function vectonum(d, base=10)
s = zero(eltype(d))
for val in d
s = s * base + val
end
return s
end