Целое число к системе base-x с использованием рекурсии в python

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

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

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

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

Ответ 1

У вас нет оператора return в блоке 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'

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Я рекомендую использовать мой 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

Ответ 4

Вы также можете попробовать подход ниже

def base10toN(num,n):
return ((num == 0) and  "0" ) or ( base10toN(num // n, n).strip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[:n][num % n])

Ответ 5

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

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

Ответ 6

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

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; не проверяет правильность аргументов

ТЕСТОВЫЙ ЗАБЕГ

% 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
%