Получить список результатов функции, пока результат> x - PullRequest
0 голосов
/ 27 августа 2018

Я в основном хочу то же самое, что и этот OP: Существует ли идиома J для добавления в список, пока не будет выполнено определенное условие? Но я не могу получить ответы для работы с функцией OP или с моей собственной,Я перефразирую вопрос и напишу об ответах внизу.

Я пытаюсь создать функцию, которая будет возвращать список чисел Фибоначчи меньше, чем 2.000.000.(без написания "while" внутри функции).Вот что я попробовал:

Сначала я выбрал способ вычисления чисел Фибоначчи с этого сайта: https://code.jsoftware.com/wiki/Essays/Fibonacci_Sequence

fib =: (i. +/ .! i.@-)"0
        echo fib i.10
        0 1 1 2 3 5 8 13 21 34

Затем я составил произвольный список, который, как я знал, был большечто мне нужно:

fiblist =: (fib i.40)       NB. THIS IS A BAD SOLUTION!

Наконец, я удалил числа, которые были больше, чем мне нужно:

result =: (fiblist < 2e6) # fiblist 
        echo result 
        0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181     6765 10946 17711    28657 46368 75025 121393 196418 317811 514229 832040 1.34627e6

Это дает правильный результат, но есть способ избежать использования произвольного числакак 40 в "fib i.40"?

Я хотел бы написать функцию, такую, чтобы "func 2e6" возвращал список чисел Фибоначчи ниже 2.000.000.(без написания «while» внутри функции).

echo func 2e6
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711    28657 46368 75025 121393 196418 317811 514229 832040 1.34627e6

вот ответы на другой вопрос:

первый ответ:

 2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
    128 192 160 112 144 176

второй ответ:

+:^:(100&>)^:(<_) ] 3 
3 6 12 24 48 96 192

Насколько я понимаю, мне просто нужно заменить функции, используемые в ответах, но я не понимаю, как это может работать.Например, если я попытаюсь:

echo (, [: +/ _2&{.)^:(100&>@:])^:_ i.2

, я получу ошибку.

1 Ответ

0 голосов
/ 27 августа 2018

Я подошел к этому так.Сначала я хочу получить способ генерирования n-го числа Фибоначчи, и я использовал f0b из вашей ссылки на эссе Jsoftware.

   f0b=: (-&2 +&$: -&1) ^: (1&<) M.

После того, как я это сделал, я просто хочу поместить его в глаголэто проверит, чтобы увидеть, является ли результат f0b меньше определенной величины (я использовал 1000), и если это было так, я увеличил ввод и повторил процесс снова.Это часть ($:@:>:).$: - это самообращение.Правильный аргумент 0 является отправной точкой для генерации последовательности.

   ($:@:>: ^: (1000 > f0b)) 0
17

Это говорит о том, что 17-е число Фибоначчи является наибольшим, меньше моего предела.Я использую эту информацию, чтобы сгенерировать числа Фибоначчи, применяя f0b к каждому элементу в i. ($:@:>: ^: (1000 > f0b)) 0, используя ранг 0 (fob"0)

   f0b"0 i. ($:@:>: ^: (1000 > f0b)) 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

В вашем случае вы хотели получить числа под 2000000

   f0b"0 i. ($:@:>: ^: (2000000 > f0b)) 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269

... и тогда я понял, что вы хотели, чтобы глагол мог ответить на ваш первоначальный вопрос.Я пошел с диадическим, где левый аргумент является пределом, а правый аргумент генерирует последовательность.Та же идея, но я смог использовать некоторые крючки, когда я перешел на молчаливую форму.(> f0b) проверяет, находится ли результат f0b ниже предела, и ($: >:) увеличивает правый аргумент, оставляя левый аргумент для $:

   2000000 (($: >:) ^: (> f0b)) 0
32
   fnum=: (($: >:) ^: (> f0b)) 
   2000000 fnum 0
32
   f0b"0 i. 2000000 fnum 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269

У меня мало сомнений, что появятся другиес лучшими решениями, но это то, что я собрал сегодня вечером.

...