fibonacci-获取函数结果列表,直到结果> x

我基本上想要与此OP相同的东西:
Is there a J idiom for adding to a list until a certain condition is met?
但是我无法获得使用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

这样可以得到正确的结果,但是有一种方法可以避免使用某些任意数字,例如
“ fib i.40”中的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

我得到一个错误.

最佳答案
我是这样处理的.首先,我想有一种方法可以生成第n个斐波那契数,然后从您到Jsoftware Essays的链接中使用了f0b.

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

掌握了这些信息后,我只想将其放入动词中,即可检查f0b的结果是否小于某个量(我使用了1000),如果是,那么我增加了输入量并再次进行了处理.这是($:@:> :)部分. $:是自参考.右边的0参数是生成序列的起点.

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

这告诉我,第17个斐波那契数是最大的数,比我的限制小.我使用该信息通过将f0b应用于i中的每个项目来生成斐波那契数. ($:@:&gt ;: ^:(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

…然后我意识到您想要一个动词来回答您的原始问题.我使用dyadic,左参数为极限,右参数生成序列.同样的想法,但是当我使用默认形式时,我能够使用一些钩子. (> 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

我毫不怀疑其他人会提出更好的解决方案,但这就是我今晚凑齐的.

转载注明原文:fibonacci-获取函数结果列表,直到结果> x - 代码日志