Целочисленная система base-x с использованием рекурсии в python - PullRequest
1 голос
/ 18 января 2010

Я пытаюсь написать рекурсивный код, который может преобразовать число в любую базовую систему.например, целое число 10 в двоичном виде будет преобразовано в 1010

Пока у меня есть это, но у меня есть "None" между выходными данными.Может ли кто-нибудь помочь мне с моим кодом?

def convert(a,b):
    add = a%b
    if a<=1:
        return a
    else:
        print(base(a//b,b), add)

Моя идея состоит в том, что% b - это число, которое нужно добавить в конец числа, а a // b - это рекурсивная часть, где он использует ответпредыдущее двоичное число, так что 10 в базе 2 просто конвертировать (5,2) и добавить 0 в конце, так как a // b = 5 и a% b = 0, что = 1010

Ответы [ 5 ]

1 голос
/ 27 мая 2015

Я работаю над созданием пакета для этого пункта.

Я рекомендую вам использовать мой Base.py https://github.com/kamijoutouma/bases.py, который был вдохновлен Base.js

from bases import Bases
bases = Bases()

bases.toBase16(200)                // => 'c8'
bases.toBase(200, 16)              // => 'c8'
bases.toBase62(99999)              // => 'q0T'
bases.toBase(200, 62)              // => 'q0T'
bases.toAlphabet(300, 'aAbBcC')    // => 'Abba'

bases.fromBase16('c8')               // => 200
bases.fromBase('c8', 16)             // => 200
bases.fromBase62('q0T')              // => 99999
bases.fromBase('q0T', 62)            // => 99999
bases.fromAlphabet('Abba', 'aAbBcC') // => 300

см. https://github.com/kamijoutouma/bases.py#known-basesalphabets для каких баз можно использовать

По вашему конкретному вопросу

Если вы хотите перейти на двоичный код и обратно, вы можете сделать

>>> from bases import Bases
>>> bases = Bases()
>>> bases.toBase(200,2)
'11001000'
>>> bases.fromBase('11001000',2)
200
>>> bases.toBase2(200)
'11001000'
>>> bases.fromBase2('11001000')
200

Веселись !!!

И снова список используемых баз с этой библиотекой приведен в https://github.com/kamijoutouma/bases.py#known-basesalphabets

1 голос
/ 18 января 2010

У вас нет оператора возврата в вашем блоке else, и у вас нет рекурсивного вызова convert.

Я думаю, что вы хотите:

if a<=1:
    return str(a)
else:
    return str(convert(a//b,b)) + str(add)

как в

>>> def convert(a,b):
...   add = a%b
...   if a<=1:
...     return str(a)
...   else:
...     return str(convert(a//b,b)) + str(add)
... 
>>> convert(10,2)
'1010'

В общем, старайтесь избегать смешивания типов в рекурсивных функциях. Чаще всего ваш базовый и рекурсивный регистры должны возвращать один и тот же тип.

1 голос
/ 18 января 2010

Я рекомендую вам структурировать ваш код более точно.Вы можете разбить неопределенно заданную вами задачу на различные подзадачи, например:

  • для определения и нормализации знаков числа и базы (вам нужно для поддержки отрицательных значений)оснований, или вы можете просто вызвать исключение?), также гарантируя, что немедленное исключение возникает в случаях ошибок (например, основание 0 или 1);
  • написать функцию, которая (дает положительное иправильные значения для a и b) возвращают «последовательность цифр» для представления a в базе b, где «цифра» - это целое число между 0 включенными и b исключенными;
  • напишите функцию, которая с учетом расширений знака и последовательности цифр строит и возвращает строковое представление - зависит от того, как вы хотите представить очень большие «цифры», когда b велико, например> 36, если вы хотитеиспользуйте цифры, затем буквы ASCII, для первых 36 цифр очевидным образом;возможно, вам следует принять строку «алфавита», чтобы использовать ее для этой цели (и первая вышеупомянутая функция должна вызывать исключение, когда b слишком велика для данного алфавита)
  • написать функцию, которая использует все вышеперечисленные для печатистрока out

Из этих задач только вторая может рассматриваться как подходящая для «рекурсивной» реализации, если кто-то настаивает (хотя итеративная реализация на самом деле намного более естественна!) - учитываячто это домашнее задание, я думаю, вам придется делать это рекурсивно, потому что это часть назначенного задания, ну что ж! -).Но, для справки, одним очевидным способом итерации было бы:

  def digitsequence(a, b):
    results = []
    while True:
      results.append(a % b)
      if a < b: break
      a //= b
    return reversed(results)

, если предположить, что нужно, чтобы последовательность цифр была в «старшем» порядке, к которому мы привыкли, из того, как позиционная десятичная запись вошла в западную культуру (в арабском оригинале это был более естественно вычисляемый порядок с прямым порядком байтов ... но арабский язык, написанный справа налево, буквальная транскрипция этого порядка на европейских языках, написанная слева направо, стала символом прямого порядка!-).

В любом случае, вы можете использовать простую линейную рекурсию как способ неявного «обращения» вещей (вы могли бы сказать, что такая рекурсия «скрывает» стек «последний вошел, первым вышел», что явноспособ перевернуть последовательность ;-), что, я думаю, откуда берется спецификация рекурсии в домашнем задании; -).

0 голосов
/ 09 января 2019

Простое рекурсивное решение (с ограничениями) и код для его проверки:

from string import hexdigits

def convert(a, b):

    return '0' if a == 0 else convert(a // b, b).lstrip('0') + hexdigits[a % b]

if __name__ == '__main__':

    # Test code

    from random import randint

    for _ in range(10):
        number = randint(0, 1000)
        base = randint(2, 16)

        conversion = convert(number, base)

        print(number, "base", base, "->", conversion, "->", int(conversion, base), "base", base)

Ограничения включают отсутствие поддержки отрицательных чисел;в настоящее время ограничено основаниями в диапазоне 2 - 16;не проверяет недопустимые аргументы.

TEST RUN

% python3 test.py
127 base 3 -> 11201 -> 127 base 3
666 base 3 -> 220200 -> 666 base 3
348 base 2 -> 101011100 -> 348 base 2
139 base 10 -> 139 -> 139 base 10
464 base 7 -> 1232 -> 464 base 7
330 base 11 -> 280 -> 330 base 11
633 base 10 -> 633 -> 633 base 10
789 base 4 -> 30111 -> 789 base 4
355 base 15 -> 18a -> 355 base 15
582 base 8 -> 1106 -> 582 base 8
%
0 голосов
/ 18 января 2010

Функция convert возвращает None, а print печатает ее. Вам следует либо удалить вызов print, либо накопить результат в виде строки и вернуть его.

(я предполагаю, что вызов base на самом деле предназначен для рекурсивного вызова convert.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...