朱莉娅:将向量转换为以n为底的数字

uni*_*eur 3 julia

我需要一个函数,将整数向量解释为具有一定基数的数字,如下所示:

vectonum([1,2,3,4], 10) #=> 1234
vectonum([0,0,0,1], 2) #=> 1
vectonum([1,1,1,1], 2) #=> 15
Run Code Online (Sandbox Code Playgroud)

以下函数可以完成此任务,但对我来说有点尴尬:

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

Run Code Online (Sandbox Code Playgroud)

是否有更好的,更朱莉亚风格的方法来执行此操作,甚至可能是内置函数或模块?

提前致谢!

Bog*_*ski 6

你可以写:

f(v, b) = foldl((x,y) -> b*x+y, v)
Run Code Online (Sandbox Code Playgroud)

这可能是最短和最快的。foldl((x,y) -> b*x+y, v, init=0)如果您希望它也适用于返回空向量,请在调用中将其更改为0

我也想到了一些替代方法,因此我在下面发布了它们。

首先,相对较短(不是很快)的方法是:

f(v, b) = parse(Int, join(v), base=b)
Run Code Online (Sandbox Code Playgroud)

在您的实现过程中会发生以下情况:

f(v, b) = sum(x -> b^(x[1]-1)*x[2], enumerate(Iterators.reverse(v)))
Run Code Online (Sandbox Code Playgroud)