Поэтому я не очень понимаю, чего вы пытаетесь достичь, но давайте сначала попробуем запустить пример 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 это печатает только нули, потому что вы не работаете с рациональными числами , но просто выполняя целочисленное деление, которое усекается до нуля (с последующим умножением на 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). Однако все они принадлежат к «семье Лиспов».
Если под 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
в качестве начальной точки цикла, результирующая последовательность будет точно такой же.
person
coredump
schedule
18.04.2020