Есть ли идиома для добавления в список, пока не будет выполнено определенное условие?

Представьте, что вы генерируете числа Фибоначчи, используя очевидный алгоритм перебора. Если я знаю число Фибоначчи, которое я хочу сгенерировать заранее, я могу сделать что-то подобное, используя силовое соединение ^::

(, [: +/ _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
Другие вопросы по тегам