Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int
:
int x;
x = 10;
В этом примере переменная x является int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.
Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:
Integer num;
num = new Integer(10);
Первая строка объявляет переменную с именем num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».
Во второй строке ключевое слово new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка).
Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.
Например, вы можете имеют следующий метод:
public void doSomething(SomeObject obj) {
//do something to obj
}
В этом случае вы не создаете объект obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом:
doSomething(null);
В этом случае obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.
Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething
может быть записано как:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
Наконец, Как определить исключение & amp; причина использования Трассировки стека
1↓[2?+1]
Или 10 символов с печатью:
1↓[2?+↓£1]
Запуск с помощью:
RePeNt "1↓[2?+1]"
RePeNt - это игрушечный язык на основе стека, который я написал (и все еще совершенствую), в котором все операторы/функции/блоки/циклы используют обратную польскую нотацию (RPN).
Command Explanation Stack
------- ----------- -----
1 Push a 1 onto the stack 1
↓ Push last stack value 1 1
[ Start a do-while loop 1 1
2? Push a two, then pop the 2 and copy the last 2 stack 1 1 1 1
items onto the stack
+ Add on the stack 1 1 2
↓£ Push last stack value then print it 1 1 2
1 Push a 1 onto the stack 1 1 2 1
] Pop value (1 in this case), if it is a 0 exit the loop 1 1 2
otherwise go back to the loop start.
Ответ находится в стеке, который строится следующим образом:
1 1
1 1 2
1 1 2 3
1 1 2 3 5
Он никогда не завершается (это эквивалентно циклу C#/JAVA do { } while(true)
), потому что последовательность никогда не завершится, но завершающее решение может быть записано так:
N_1↓nI{2?+}
что составляет 12 символов.
Интересно, прочитает ли кто-нибудь это когда-нибудь :(
@Andrea Ambu
повторяющаяся версия pythonic fibonacci()
должен посмотреть что-то как этот:
def fibonacci(a=0, b=1):
while True:
yield b
a, b = b, a+b
Не самое короткое, но самое быстрое во время регистрации.:-)
float f(float n) {
return (pow(1+sqrt(5.0))/2.0),n) - pow(1+sqrt(5.0))/2.0),n)/sqrt(n));
}
33 символа в C:
F(n){return n<2?n:F(n-1)+F(n-2);}
Призма Дельфи (Дельфи для .net)
f:func<int32,int32>:=n->iif(n>1,f(n-1)+f(n-2),n)
49 символов
Предыдущий пример Ruby не будет работать w/o или точки с запятой или новые строки, таким образом, это будут на самом деле 32 символа. Вот первый пример, который на самом деле произведет последовательность, не только возвращают значение указанного индекса.
Ruby:
53 символа, включая новые строки:
def f(n);n<2?1:f(n-1)+f(n-2);end
0.upto 20 {|n|p f n}
или если Вы хотите функцию, которая производит применимую структуру данных, 71 символ:
def f(n);n<2?1:f(n-1)+f(n-2);end
def s(n);(0..n).to_a.map {|n| f(n)};end
или принимающий командную строку args, 70 символов:
def f(n);n<2?1:f(n-1)+f(n-2);end
p (0..$*[0].to_i).to_a.map {|n| f(n)}
Ruby (30 символов):
def f(n)n<2?n:f(n-1)+f(n-2)end
C#
я вижу много ответов, которые на самом деле не генерируют последовательность, но вместо этого дают Вам только число Фибоначчи в положении *n использование рекурсии, которая, когда циклично выполнено можно генерировать последовательность, становится все больше медленнее в более высоких значениях n.
using System;
static void Main()
{
var x = Math.Sqrt(5);
for (int n = 0; n < 10; n++)
Console.WriteLine((Math.Pow((1 + x) / 2, n) - Math.Pow((1 - x) / 2, n)) / p) ;
}
22 символа с dc:
1[pdd5**v1++2/lxx]dsxx
Вызывают с также:
dc -e'1[pdd5**v1++2/lxx]dsxx'
Или:
echo '1[pdd5**v1++2/lxx]dsxx' | dc
Примечание: не моя работа, на которую незаконно охотятся от perlmonks.
13 символов [1 118] Golfscript:
2,~{..p@+.}do
<час> Обновление для объяснения операции сценария:
2,
делает массив [0 1]
~
, помещает тот массив на стек do
, мы начинаем стек с 0 1
(1 наверху стека) do
цикл:
.
дубликаты главный объект стека; здесь, мы делаем это дважды (оставляющий нас с 0 1 1 1
на выполненной начальной букве) p
печать, самое верхнее значение (оставляющий нас с [1 110]) @
поворачивает лучшие 3 объекта в стеке, так, чтобы третье самое верхнее было в вершине (1 1 0
) +
, добавляют лучшие 2 объекта в стеке (уезжающий 1 1
) .
дубликаты главное значение, так, чтобы do
цикл мог проверить свое правдоподобие (чтобы определить, продолжить ли) Трассировка этого мысленно, нескольких циклов будет достаточно, чтобы сказать Вам, что это делает необходимое дополнение для генерации значений последовательности Fibonacci.
, Так как GolfScript имеет сверхбольшие числа, никогда не будет целочисленного переполнения, и таким образом, значение вершины стека в конце do
цикл никогда не будет 0. Таким образом сценарий будет работать навсегда.
Язык: ошибки компилятора C++
символы: 205
#define t template <int n> struct
#define u template <> struct f
t g { int v[0]; };
t f { enum { v = f<n-1>::v + f<n-2>::v }; g<v> x;};
u<1> { enum { v = 1 }; };
u<0> { enum { v = 0 }; };
int main() { f<10> x; }
Символы Perl 6 - 22:
sub f{1,1...{$^a+$^b}}
Генерируйте последовательность Fibonacci. ПОСЛЕДОВАТЕЛЬНОСТЬ последовательности!
J, 27 символов для нерекурсивной функции:
f=:3 :'{:}.@(,+/)^:y(0 1x)'
+/
суммы по списку.
(,+/)
добавляет сумму списка к его хвосту.
}.@(,+/)
суммы список, добавляет элемент к своему хвосту и отбрасывает первый элемент.
}.@(,+/)^:y
выполняет итерации вышеупомянутой функции y
времена.
}.@(,+/)^:y(0 1x)
применяется, вышеупомянутая функция к списку (0,1)
(эти x
делает его целым числом).
{:}.@(,+/)^:y(0 1x)
берет последний элемент выходного списка вышеупомянутого.
f=:3 :'{:}.@(,+/)^:y(0 1x)'
определяет f
, чтобы быть функцией на одной переменной y
.
Для записи:
function f(n)if n<2 then return n else return f(n-1)+f(n-2)end end
function f(n){return n<2?n:f(n-1)+f(n-2)}
int f(int n){return n<2?n:f(n-1)+f(n-2);}
я не много знатока супер кратких языков...:-P
Chris является правильным, я просто взял простой, рекурсивный алгоритм. На самом деле линейный еще короче в Lua (благодаря нескольким присвоение)! JavaScript не так удачен, и Java хуже, имея необходимость объявить Вар...
function f(n)a=1;b=0;for i=1,n do a,b=b,a+b end return b end
function f(n){a=1;b=i=0;for(;i++<n;){x=a+b;a=b;b=x}return b}
int f(int n){int a=1,b=0,i=0;for(;i++<n;){int x=a+b;a=b;b=x;}return b;}
я записал бы код Lua с local a,b=1,0
, но это более длинно, поэтому давайте загрязним _G!;-) То же самое для JS.
Для полноты, вот терминальные рекурсивные версии. Один Lua, с помощью последнего вызова, с такой скоростью, как линейный (но 69 символов, это является самым длинным!) - должен назвать их с тремя параметрическими усилителями, n, 1,0.
function f(n,a,b)if n<1 then return b else return f(n-1,b,a+b)end end
function f(n,a,b){return n<1?b:f(n-1,b,a+b)}
int f(int n,int a,int b){return n<1?b:f(n-1,b,a+b);}
Исправленный после комментариев (благодарит Sebastian), это не было решение для последовательности, таким образом, здесь мы идем с 42 символами (включает \n):
def f(a=0,b=1):
while 1:yield a;a,b=b,a+b
<час> Python, 38 символов.
f=lambda n:n if n<2 else f(n-1)+f(n-2)
Не настолько короткий, но самое читаемое, по-моему: РЕДАКТИРОВАНИЕ P
: Вот аналитический путь (если кто-то должен видеть его в Python:-)
f=lambda n:int(.5+(.5+5**.5/2)**n/5**.5)
Короче dc решение.
dc -e'1df[dsa+plarlbx]dsbx'
Windows XP (и более поздние версии) сценарий пакетной обработки. Эта пакетная функция, когда дали отдельный аргумент - сумма, генерирует amount+1 Числа Фибоначчи и возвращает их как строку (ПАКЕТ действительно не имеет наборов) в переменной %r % (369 символов или 347 символов - если мы удаляем добавление отступа):
:f
set i=0
set r=1
set n=1
set f=0
:l
if %n% GTR %~1 goto e
set f=%f% %r%
set /A s=%i%+%r%
set i=%r%
set r=%s%
set /A n+=1
goto l
:e
set r=%f%
exit /B 0
И вот полный сценарий, чтобы видеть его в действии (просто копия - мимо него в Командный файл или Bat-файл и выполнить его):
@echo off
call :ff 0
call :ff 1
call :ff 2
call :ff 3
call :ff 5
call :ff 10
call :ff 15
call :ff 20
exit /B 0
:ff
call :f "%~1"
echo %~1: %r%
exit /B 0
:f
set i=0
set r=1
set n=1
set f=0
:l
if %n% GTR %~1 goto e
set f=%f% %r%
set /A s=%i%+%r%
set i=%r%
set r=%s%
set /A n+=1
goto l
:e
set r=%f%
exit /B 0
F#:
(0,1)|>Seq.unfold(fun(a,b)->Some(a,(b,a+b)))
44 Символа
Вот моя лучшая схема использования в 45 символах:
(let f((a 0)(b 1))(printf"~a,"b)(f b(+ a b)))
18 символов английского языка..
"Последовательность Fibonacci"
хорошо, я перестал работать.:)
let rec f l a b =function 0->a::l|1->b::l|n->f (a::l) b (a+b) (n-1) in f [] 1 1;;
80 символов, но действительно генерирует последовательность за линейное время.
Lua - 49 символов
function f(n)return n<2 and n or f(n-1)+f(n-2)end
Существует класс OrderedDictionary , который является словарем, но может индексироваться в порядке вставки, но не является универсальным. В настоящее время в среде .Net нет обобщенной версии.
Я читал где-то комментарий от кого-то из команды .Net, в котором говорилось, что они могут реализовать обобщенную версию в будущем, но в таком случае он, скорее всего, будет называться IndexableDictionary
вместо OrderedDictionary
, чтобы сделать его поведение более очевидным.
EDIT: нашел цитату. Он был на странице MSDN для OrderedDictionary
, приписываемой Дэвиду М. Кину из Microsoft:
Этот тип на самом деле неправильно назван; это не «упорядоченный» словарь как таковой, а скорее «индексированный» словарь. Хотя, Ввод n в стеке, возвращает F n в AX.
59 31 C0 E3 08 89 C3 40 93 01 D8 E2 FB C3
Выводит бесконечный список чисел Фибоначчи, начиная с 0, разделенных табуляцией (можно уменьшить до 29 символов, удалив 9,
в первой строке, за счет отсутствия пробелов между числами).
К сожалению, все интерпретаторы Befunge-93, которые я пробовал, кажутся переполненными после 65k, поэтому результат верен только до 46368 включительно (что составляет F 24 ).
#v::1p1>01g:.\:01p+9,# > ^
Подтверждена работа (с оговоркой выше) с интерпретатором Befunge-93 в Javascript и Visual Befunge Applet Full .
Я с гордостью могу сказать, что это полностью оригинальная работа (т.е. я ни у кого не копировал этот код), и он намного короче, чем решение Befunge, которое в настоящее время находится на Rosetta Code .
Brainfuck , 33 символа:
+.>+.[<[>+>+<<-]>.[<+>-]>[<+>-]<]
Ассемблер PDP-11 ( исходный код )
.globl start
.text
start:
mov $0,(sp)
mov $27,-(sp)
jsr pc, lambda
print_r1:
mov $outbyte,r3
div_loop:
sxt r0
div $12,r0
add $60,r1
movb r1,-(r3)
mov r0,r1
tst r1
jne div_loop
mov $1,r0
sys 4; outtext; 37
mov $1,r0
sys 1
lambda:
mov 2(sp),r1
cmp $2,r1
beq gottwo
bgt gotone
sxt r0
div $2,r0
tst r1
beq even
odd:
mov 2(sp),r1
dec r1
sxt r0
div $2,r0
mov r0,-(sp)
jsr pc,lambda
add $2,sp
mov r0,r3
mov r1,r2
mov r3,r4
mul r2,r4
mov r5,r1
mov r3,r4
add r2,r4
mul r2,r4
add r5,r1
mul r3,r3
mov r3,r0
mul r2,r2
add r3,r0
rts pc
even:
mov 2(sp),r1
sxt r0
div $2,r0
dec r0
mov r0,-(sp)
jsr pc,lambda
add $2,sp
mov r0,r3
mov r1,r2
mov r2,r4
mul r2,r4
mov r5,r1
mov r2,r4
add r3,r4
mul r4,r4
add r5,r1
mov r2,r4
add r3,r4
mul r2,r4
mov r5,r0
mul r2,r3
add r3,r0
rts pc
gotone:
mov $1,r0
mov $1,r1
rts pc
gottwo:
mov $1,r0
mov $2,r1
rts pc
.data
outtext:
.byte 62,63,162,144,40,106,151,142,157,156
.byte 141,143,143,151,40,156,165,155
.byte 142,145,162,40,151,163,40
.byte 60,60,60,60,60
outbyte:
.byte 12
BrainF ** k:
>+++++>+>+<[[>]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[>+>+<<-]>>[<<+>>-]<[<]>-]
Это сгенерирует первые 5. Чтобы сгенерировать больше, замените 5 + в начале на большее: например:
>++++++++++++++++++++++>+>+<[[>]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[>+>+<<-]>>[<<+>>-]<[<]>-]
Lucid
f = 1 fby 1 fby f + prev f;
27 символов, включая пробелы.
Euphoria: 44 символа
object f=1&1 loop do f&=f[$]+f[$-1]until 0
Генерация продолжается до тех пор, пока не закончатся ОЗУ или двойники.