Форум сайта python.su
Вынуждена просить у вас помощи. Надо написать программу, которая переводит число (число целое, может быть и отрицательным) из 10сс в 16сс, с помощью рекурсии. Рекурсии в целом понимаю плохо, поэтому прошу помощи у Всевышних.
Офлайн
>>> def to_base(n, base): ... def f(n, base, acc): ... if n == 0: ... return acc ... return f(n // base, base, [n % base] + acc) ... alpha = '0123456789abcdefghijklmnopqrstuvwxyz' ... out = ''.join(alpha[i] for i in f(n, base, [])) or '0' ... return out ... >>> to_base(12345, 16) '3039' >>> to_base(128, 16) '80' >>> to_base(10, 16) 'a' >>> to_base(0, 16) '0' >>> >>> to_base(12345, 2) '11000000111001' >>> to_base(12345, 36) '9ix' >>>
>>> def to_base(n, base): ... def f(n, base, acc): ... if n == 0: ... return acc ... return f(n // base, base, [n % base] + acc) ... alpha = '0123456789abcdefghijklmnopqrstuvwxyz' ... out = ''.join(alpha[i] for i in f(abs(n), base, [])) or '0' ... if n < 0: ... out = '-' + out ... return out ... >>> to_base(12345, 16) '3039' >>> to_base(128, 16) '80' >>> to_base(10, 16) 'a' >>> to_base(0, 16) '0' >>> to_base(-12345, 16) '-3039' >>> >>> to_base(12345, 2) '11000000111001' >>> to_base(12345, 36) '9ix' >>>
Отредактировано py.user.next (Март 8, 2017 17:39:38)
Офлайн
Огромное Вам спасибо! Правда, я не совсем понимаю, для чего служит параметр “асс”…
Отредактировано Saint (Март 8, 2017 19:00:53)
Офлайн
SaintЭто накопитель (accumulator), в нём накапливается результат, который потом и возвращается. Накопитель используется для того, чтобы рекурсия была хвостовой. Хвостовая рекурсия даёт возможность компилятору неявно оптимизировать вызовы таким образом, чтобы потребление оперативной памяти не росло при каждом вызове, а оставалось постоянным. Если же рекурсия не хвостовая, то каждый новый вызов ложится рядом с предыдущим, а не вместо него, и таким образом потребляется всё больше и больше памяти.
для чего служит параметр “асс”…
>>> def f(n, base, acc): ... if n == 0: ... return acc ... return f(n // base, base, [n % base] + acc) ... >>> f(12345, 16, []) [3, 0, 3, 9] >>> f(123451234512345, 16, []) [7, 0, 4, 7, 3, 10, 15, 10, 14, 13, 13, 9] >>>
>>> import math >>> >>> def f(n, base, acc): ... if n == 0: ... return acc ... return f(n // base, base, [n % base] + acc) ... >>> f(math.factorial(3000), 16, []) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in f File "<stdin>", line 4, in f File "<stdin>", line 4, in f ...
Отредактировано py.user.next (Апрель 25, 2021 22:03:47)
Офлайн