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