如何使用L语言编写阶乘函数?

时间:2013-01-23 01:28:25

标签: theory regular-language

L语言包含以下说明:

V <- V
V <- V+-1
IF V != 0 GOTO L, where each instruction may or may not have the label [L]

如何在L?

中编写阶乘函数

1 个答案:

答案 0 :(得分:0)

在下文中,我假设您能够使用return语句编写函数。否则,您可以内联所有函数并为局部变量使用新变量,并为结果使用新变量。返回应该在函数体之后引起一个新的分支。换句话说,我使用函数/返回语法来降低复杂性,而不是因为它为语言增加了任何力量。

有人可能反对我得到像递归等等,但我没有使用它;循环由GOTO完成。根据第二个参数的符号,可以将Subtact / Add函数组合成一个,所以我认为每个函数调用另一个都没有坏处。将这些结合起来,并且通常删除函数/返回语法,留作练习。

(1)写一个符号函数;如果为0则返回0,如果为正则返回1,如果为负则返回-1。

Sign(X)
 1. Y <- X
 2. Z <- X
 3. if Y=0 GOTO 8
 4. if Z=0 GOTO 10
 5. Y <- Y + 1
 6. Z <- Z - 1
 7. if 0=0 GOTO 3
 8. if Z=0 GOTO 11
 9. return -1
10. return +1
11. return 0

(2)写加法和减法函数。

Add(X, Y)
 1. Sx = Sign(X)
 2. Sy = Sign(Y)
 3. if Sx=0 GOTO 13
 4. if Sy=0 GOTO 14
 5. SyP <- Sy + 1
 6. if SyP=0 GOTO 15
 7. Z <- Y
 8. R <- X
 9. R <- R + 1
10. Z <- Z - 1
11. if Z=0 GOTO 16
12. if 0=0 GOTO 9
13. return Y
14. return X
15. R <- Subtract(X, Y)
16. return R

同样用于减法。

(3)写一个乘法函数。

Multiply(X, Y)
 1. Sy = Sign(y)
 2. if Sy=0 GOTO 18
 3. SyP = Sy + 1
 4. if SyP=0 GOTO 12
 5. C <- Y
 6. R <- 0
 7. C <- C - 1
 8. R <- Add(R, X)
 9. if C=0 GOTO 11
10. if 0=0 GOTO 7
11. return R
12. C <- Y
13. R <- 0
14. C <- C + 1
15. R <- Subtract(R, X)
16. if C=0 GOTO 11
17. if 0=0 GOTO 14
18. return 0

(4)写出阶乘函数。

Factorial(X)
 1. Sx = Sign(X)
 2. if Sx=0 GOTO 11
 3. SxP = Sx + 1
 4. if Sx=0 GOTO 11
 5. R <- 1
 6. C <- X
 7. R <- Multiply(R, C)
 8. C <- C - 1
 9. if C=0 GOTO 12
10. if 0=0 GOTO 7
11. return 1
12. return R

你可能需要按摩这些来严格按照你的L制定,但这些想法是合理的(我引入的模数愚蠢的错误,第一次用这种语言写作)。