1

我的目标是在 Forth 中构建一个素数生成器。不是 Eratosthenes 的筛子,而是两个嵌套循环,它们对数字 A 和数字 B 的所有组合进行暴力破解。在源代码中,我对循环有一个词,用于测试条件是否为真,并尝试进行嵌套循环。但是在使用 gforth 执行代码后,会显示堆栈下溢错误。也许某处缺少某种 dup,但循环中的 i 和 j 索引也有可能是错误的。问题是,如果我更改代码中的某些内容,堆栈就会不同。这意味着,在将 for 循环的索引号放到屏幕上之后,就无法再访问该数字了。我还发现很难访问变量,因为 Forth 似乎根本没有变量。所以我创建了一个辅助变量,

我知道,代码看起来有点混乱,有人可以帮忙吗?

variable temp
: numbers
  10 0 do i . loop
;
: cond
  0 dup
  0 = if ." equal 0" endif
;
: plain
10 2 mod .
10 3 mod .
10 4 mod .
10 5 mod .
10 6 mod .
10 7 mod .
10 8 mod .
10 9 mod .
;
: plain2
10 temp !
\ 10 0 do temp @ i mod . loop
\ 10 0 do temp @ . i . loop
10 2 do temp @ i mod . cond loop
;
: cond2 ( n - n )
  10 2 do i 
  10 2 do i 
  mod .
  loop cr loop
;

: main
  \ numbers
  cond2
  \ plain
  \ plain2
;
main
CR bye
4

1 回答 1

1

您的代码中有几个错误和重复。例如,用您的cond话来说,您将0其放在数据堆栈上,然后dup将堆栈顶部值(即0)与0. 当然,你true每次都会得到。

似乎您尝试一次编写许多单词定义并在程序中使用它们,而没有仔细调试每个单词。通过Forth编程,最好制作(和调试)几个简短的单词,然后用它们编写更复杂的代码。我建议您阅读很好地描述了这种方法的Starting Forth 书。

关于您的代码 - 最好完全重写它。这里是:

: is-not-divided-by mod 0= INVERT ;

: check-prime-number true SWAP DUP 2 DO DUP I is-not-divided-by ROT AND SWAP loop DROP ;

: is-prime-number DUP 2 > IF check-prime-number ELSE DROP true THEN ; 

: prime-numbers 1 DO I is-prime-number IF I . THEN LOOP ;

现在10 prime-numbers将打印从 1 到 9 的素数。

于 2019-01-09T11:21:55.900 回答