Python рекурсивно конвертировать десятичные в шестнадцатеричные - PullRequest
0 голосов
/ 25 апреля 2011

Как бы вы рекурсивно или итеративно изменили десятичное на шестнадцатеричное?

Я написал пример программы, которая на самом деле не работает:

def ChangeHex(n):
    if (n < 0):
        print(0)
    elif (n<=1):
        print(n)
    else:
        ChangeHex(n / 16)
        if (n == 15):
            print("F")
        if (n == 14):
            print("E")
        if (n == 13):
            print("D")
        if (n == 12):
            print("C")
        if (n == 11):
            print("B")
        if (n == 10):
            print("A")
        n % 16

Как бы я заставить его работать должным образом? Я знаю, что есть встроенная функция, но я хочу сделать это следующим образом.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2011

Основная причина, по которой ваша программа не «работает», заключается в том, что вы неправильно используете функции и неизменяемые объекты. Числовые объекты являются неизменяемыми, это означает, что вы не можете изменить значение числового объекта в Python, вам нужно вернуть новое число. И когда вы делаете ChangeHex(n), вы передаете значение n (т.е. числовой объект) в функцию - она ​​не знает, что существует переменная, которая была связана с этим числом. И, таким образом, когда вы изменяете локальную переменную, например n, переменная в вызывающей стороне не изменяется.

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

result += ChangeHex(n)


return result

Возможно, вы хотите вернуть то, что печатаете, но я не могу точно сказать.

То же самое относится к операциям. Так как числа неизменны, операции над числами не могут изменить число, и вам необходимо присвоить номер переменной. n % 16 ничего не делает, вам нужно присваивание, как n = n % 16 или n %= 16.

0 голосов
/ 25 апреля 2011
# Converts a decimal number to hexadecimal.
# Executes a zero-fill for up to six digits.
# This is used for correct conversion back
# to the instruction format. See zero_fill().
# @param  dec  Decimal representation of instruction
# @return  Zero-filled hexadecimal instruction.
def convert(dec):
# BEGIN convert()
    hex = "%X" % dec
    return zero_fill(hex, 6)
# END convert()

# Prepends zeros until the specified
# length is reached. Works recursively.
# @param  n  Number to fill
# @param  length  Length to reach
# @return  Zero-filled number
def zero_fill(n, length):
# BEGIN zero_fill()
    # Check if length requirement is met
    if len(n) != length:
        # Requirement not met, run function again with
        # n having one prepended zero.
        return zero_fill('0'+n, length)
    else:
        # Requirement met, return n.
        return n
# END zero_fill()
...