我已经在Forth中编写了一段代码来计算第9个斐波那契数:
." Fibonacci numbers"
: INP 9 0 ;
: FIB_0 1 0 1 ;
: FIB FIB_0 INP DO + SWAP OVER LOOP SWAP . ;
现在,我想从用户输入中读取整数N并将其提供给INP而不是9,以便可以计算任意整数斐波那契数。我在Windows上使用Gforth。
答案 0 :(得分:6)
您可以使用accept
来获取用户输入,然后使用s>number?
来尝试将其转换为数字。 accept
需要一个内存地址和一个最大长度。 's> number?`留下了双精度和标志。
所以您可以做类似的事情
: fetch-input ( - n f )
pad 40 accept
pad swap s>number?
>r d>s r> ;
如果s>number?
无法将字符串转换为数字,则会将0 0
留在堆栈上的标志下。
因此,在s>number?
之后,您在堆栈上有三个条目:双精度定点数的两个部分和一个标志-堆栈注释将是:(-n n f)。但是我假设您要使用问题中的代码给出一个单精度数字。
d>s
将采用双精度数字并将其转换为单精度。我们需要将标志移开,以便获得号码。暂时移开某事物的标准技巧是将其从数据堆栈移至返回栈,执行所需的任何操作,然后将其移回。因此,>r
和r>
。
答案 1 :(得分:2)
虽然接受的答案可以提供,但是我不确定您想要什么,您的方法与语言哲学的契合度如何。我认为在单词中执行输入是其他编程语言的一种方法。
使用以下代码:
: (fibo-iter) ( n n - n n) swap over + ;
: th-fibo ( n - n) >r 1 dup r> 2 - 0 do (fibo-iter) loop nip ;
一个人可以写:
10 th-fibo .
产生第十个斐波那契数。输入是堆栈提供的,计算是通过th-fibo
完成的,{{1}调整输入的预定义值且没有错误检查),并在需要时明确进行打印。