K шаблон для протокола итератора

Я играю с K-реализацией Джона Эрнеста в контексте задач Project Euler.

Многие из проблем включают в себя получение первых n слагаемых или всех слагаемых <= n из бесконечного ряда (особенно простых). Это может также включать выбор элементов из ранее существующего списка по одному, пока не будет выполнено условие.

В Python один из подходов заключается в том, чтобы полагаться на протокол итератора: вы можете взять итератор, пока он не закончится, или прервать работу рано, когда какое-то условие выполнено (например, вы взяли n элементов, или последний элемент, который вы приняли, удовлетворяет определенному условию). состояние).

Каковы типичные шаблоны в K (или других APL) для достижения чего-то подобного, то есть, взятие из списка или генератора до тех пор, пока условие не будет выполнено, без оценки или обработки всего списка? Должен ли я полагаться на методы ниже, возможно, используя какое-то внутреннее состояние внутри f? Не рекомендуется ли такой подход, и если да, то почему?

  f/x      / fixed point
n f/x      / apply f n times
p f/x      / do or while loop, with p a predicate function (stops when 0)

РЕДАКТИРОВАТЬ 2018-10-14: некоторые интересные заметки о ленивой итерации в APL здесь.

0 ответов

Как вы упомянули (и как было предложено в комментарии):

p f/x      / do or while loop, with p a predicate function (stops when 0)

Действительно, вы можете предоставить функцию предиката, которая будет применяться к результату на каждом этапе. Итерация продолжается, пока результат предиката равен 1b, и останавливается в противном случае. Вот как, например, остановить вычисление последовательности Фибоначчи, когда она превышает 100:

{*|x<100} {x,+/-2#x}/1 1
Другие вопросы по тегам