Есть ли идиома для добавления в список, пока не будет выполнено определенное условие?
Представьте, что вы генерируете числа Фибоначчи, используя очевидный алгоритм перебора. Если я знаю число Фибоначчи, которое я хочу сгенерировать заранее, я могу сделать что-то подобное, используя силовое соединение ^:
:
(, [: +/ _2&{.)^:20 i.2
Как я могу вместо этого остановиться, когда Фибоначчи достичь какого-то предела, скажем 1e6
? (Я знаю, как сделать это внутри функции, используя while.
, но это не весело.)
Я хочу подчеркнуть, что это общий вопрос о J, а не конкретный вопрос о Фибоначчи. Не отвлекайтесь на числа Фибоначчи. Суть вопроса в том, как продолжать добавлять в список, пока не будет выполнено какое-либо условие.
2 ответа
Я думаю, что лучший ответ на это в книге Генри Рича J для программистов на Си. В частности, это с помощью Power Conjunction ^:
, Вы также можете использовать его для схождения до тех пор, пока не произойдет никаких изменений, так что предел не нужно будет определять. Генри использует пример, который:
2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
128 192 160 112 144 176
^:_
Power Conjunction повторяется до тех пор, пока не произойдет никаких изменений и ^:(100&>@:])
тесты для результата меньше 100. Если это так ^:
применяется к 1
и петля 2*
делается снова, если оно не меньше 100, то ^:
будет применяться к 0
и это приводит к тому, что оно ничего не делает и ничего не меняется, и цикл завершается. Тот факт, что это использовать "0
поскольку ранг означает, что он может применять функцию удвоения 2*
каждому из 1 3 5 7 9 11
индивидуально.
Генри действительно объясняет процесс лучше, чем я, так что вот ссылка для дальнейшего чтения. http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm
Власть также имеет форму глаголаu^:v^:n
где второй глагол может быть использован в качестве проверки. Например: двойной (+:
) в то время как (n
является _
) менее 100 (100&>
):
+:^:(100&>)^:_ ] 1
128
+:^:(100&>)^:_ ] 3
192
Как обычно, чтобы добавить результат к власти, вы ставите существительное:
+:^:(100&>)^:(<_) ] 3
3 6 12 24 48 96 192