cython

Форк
0
/
knuth_man_or_boy_test.pyx 
61 строка · 1.3 Кб
1
# mode: run
2
# tag: closures
3

4
# Cython version of Knuth's "man or boy" test -- "It separates the man
5
# Algol 60 compilers from the boy Algol 60 compilers." Here's the
6
# original (from wikipedia):
7
#
8
# begin
9
#   real procedure A (k, x1, x2, x3, x4, x5);
10
#   value k; integer k;
11
#   begin
12
#     real procedure B;
13
#     begin k:= k - 1;
14
#           B:= A := A (k, B, x1, x2, x3, x4);
15
#     end;
16
#     if k <= 0 then A:= x4 + x5 else B;
17
#   end;
18
#   outreal (A (10, 1, -1, -1, 1, 0));
19
# end;
20
#
21
# and a table of values:
22
#
23
#   k           A
24
#   0           1
25
#   1           0
26
#   2   	-2
27
#   3   	0
28
#   4   	1
29
#   5   	0
30
#   6   	1
31
#   7   	-1
32
#   8   	-10
33
#   9   	-30
34
#   10   	-67
35
#
36
# Past 10 or so, we blow the C stack -- can't just set a higher recursion limit
37
# to get around that one.
38
#
39

40
def compute(val):
41
    if isinstance(val, int):
42
        return val
43
    else:
44
        return val()
45

46
def a(in_k, x1, x2, x3, x4, x5):
47
    """
48
    >>> import sys
49
    >>> old_limit = sys.getrecursionlimit()
50
    >>> sys.setrecursionlimit(1350 if not getattr(sys, 'pypy_version_info', None) else 2700)
51

52
    >>> a(10, 1, -1, -1, 1, 0)
53
    -67
54

55
    >>> sys.setrecursionlimit(old_limit)
56
    """
57
    k = [in_k]
58
    def b():
59
        k[0] -= 1
60
        return a(k[0], b, x1, x2, x3, x4)
61
    return compute(x4) + compute(x5) if k[0] <= 0 else b()
62

63

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.