2014-09-18 5 views
0

Мой вопрос имеет два аспекта:Область переменных и цифры функции

1) Насколько я понимаю, конструирует как для петли ввести области видимости блоков, однако у меня возникают некоторые проблемы с переменной, которое определяют вне указанной конструкции. Следующий код изображает попытку извлечь цифры из числа и поместить их в массив.

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} 

Я думал, что все, что происходит внутри для цикла невидим снаружи, если не я 'm работает с переменными, определенными вне цикла 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)])". 

Может кто-нибудь объяснить мне, как интерпретировать информацию, предоставленную о функциях в Джулию. Как мне интерпретировать digits(n[, base][, pad])? Как правильно вызвать функцию цифр? Я не могу быть таким: digits(40125[, 10])?

ответ

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! из кода выше.

+0

Ничего себе, как неловко так много ошибок в так несколько строк кода: P Но спасибо большое за очистку, что для меня , ваш код работал как шарм :) – user2912781

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 
+1

Я бы сказал, не обманывать, но не очень эффективно. Это работает! – StefanKarpinski

+1

Я решил сделать быструю проверку и да, @StefanKarpinski, эта версия выглядит примерно на порядок медленнее, чем версия Toivo, но изменение отображаемой функции на '(c) -> c - '0'' забирает ее в основном с той же скоростью :) Я предположил, что 'string (:: Int)' будет довольно быстрым (хотя при обработке еще нескольких случаев ...) - [не знаю, кому мы должны благодарить за это ...] (https: //github.com/JuliaLang/julia/blame/master/base/intfuncs.jl);) – JobJob

Смежные вопросы