所以我真的不明白你想要实现什么,但让我们先尝试运行 Python 示例。目前它的格式很糟糕(可能存在复制粘贴问题),所以这里有适当的缩进:
def f(x):
if (x <= 1/2):
return 2 * x
else:
return (2 * x) - 1
x = 1/10
for i in range(80):
print(x)
x = f(x)
在 Python 2 中,这仅打印零,因为您不使用 rational numbers,而只是执行截断为零的整数除法(然后乘以 2)。在 Python 3 中,结果将是一系列向 1.0 收敛的浮点数,因为浮点数是近似的(感谢 @ex nihilo)。
CLISP 是 Common Lisp 标准的一种特定实现,除其他外(没有特定的顺序 Lispworks、ECL、SBCL、Allegro CL、Clozure Common Lisp、ABCL、CLASP,...)。通常情况下,Common Lisp 缩写为 CL,或者有时只是 Lisp(这是一个颇有争议的观点),因为该家族的其他分支决定遵循完全不同的哲学并以不同的方式命名(Scheme、Clojure 甚至 Julia)。然而,它们都属于“Lisp 家族”语言。
如果您所说的 CLISP 是指 Common Lisp,那么一种惯用的编码方式是:
(defun f (x)
(if (<= x 1/2)
(* 2 x)
(1- (* 2 x))))
(loop
for i below 80
for x = 1/10 then (f x)
collect x)
计算结果为(*):
(1/10 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5)
所以如果你想要 Python 中的等价物,你需要使用分数:
from fractions import Fraction
def f(x):
if (x <= Fraction(1, 2)):
return 2 * x
else:
return (2 * x) - 1
x = Fraction(1,10)
r = list()
for i in range(80):
r.append(x)
x = f(x)
结果列表是:
[Fraction(1, 10), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5)]
(*) 但是
(loop
for i below 80
for x = 0.1 then (f x)
collect x)
评估为
(0.1 0.2 0.4 0.8 0.6 0.20000005 0.4000001 0.8000002 0.6000004 0.20000076
0.40000153 0.80000305 0.6000061 0.2000122 0.4000244 0.8000488 0.60009766
0.20019531 0.40039063 0.80078125 0.6015625 0.203125 0.40625 0.8125 0.625 0.25
0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
并将其转换回有理数表明它是
(13421773/134217728 13421773/67108864 13421773/33554432 13421773/16777216
5033165/8388608 838861/4194304 838861/2097152 838861/1048576 314573/524288
52429/262144 52429/131072 52429/65536 19661/32768 3277/16384 3277/8192
3277/4096 1229/2048 205/1024 205/512 205/256 77/128 13/64 13/32 13/16 5/8
1/4 1/2 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1
1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1
1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1)
确实,如果我们使用13421773/134217728作为循环的起点,结果序列是完全一样的。