Python 将数字的基数更改为给定的数字

Python 将数字的基数更改为给定的数字,python,Python,我必须编写一个递归函数,以10为基数获取一个数字(n),并将其转换为给定的基数(k),然后返回一个列表,其中它的组成部分是最后的数字位数,例如f(5,3)必须结果[1,2]以3为基数的5是12,或者f(22,3)必须结果[2,1] 以下是我尝试的代码: def cb(n, k): b = [] if n == 0: b.append(0) if n < k: b.append(n) if n == k: b.a

我必须编写一个递归函数,以10为基数获取一个数字(n),并将其转换为给定的基数(k),然后返回一个列表,其中它的组成部分是最后的数字位数,例如
f(5,3)
必须结果
[1,2]
以3为基数的5是12,或者
f(22,3)
必须结果
[2,1]

以下是我尝试的代码:

def cb(n, k):
    b = []
    if n == 0:
        b.append(0)
    if n < k:
        b.append(n)
    if n == k:
        b.append(10)
    else:
        a = n // k
        b.append(n - ((n // k) * k))
        if a < k:
            b.append(a)
        else:
            cb(a, k)

    return b

print(cb(22, 3))
def cb(n,k):
b=[]
如果n==0:
b、 追加(0)
如果n

事实上,我想了很多,但因为我不太擅长写代码,我不能再进一步了。感谢您对我的代码的帮助和修改。

您非常接近,您需要做的唯一一件事就是更改:

    else:
        cb(a, k)
致:

但是,您的输出将是:

>>> cb(22, 3)
[1, 1, 2]

这与您想要的正好相反,因为基数3中的22是
211
。您可以通过反转列表
[1,1,2][::-1]=[2,1,1]
或替换所有对
append
的调用以及对
extend
的新调用来解决此问题,改为在列表的开头添加,如:
b.insert(0,element)
b=cb(a,k)+b
<,你唯一需要做的就是改变:

    else:
        cb(a, k)
致:

但是,您的输出将是:

>>> cb(22, 3)
[1, 1, 2]

这与您想要的正好相反,因为基数3中的22是
211
。您可以通过反转列表
[1,1,2][::-1]=[2,1,1]
或替换所有对
append
的调用和对
extend
的新调用来解决此问题,例如:
b.insert(0,element)
b=cb(a,k)+b

如果你从递归的角度考虑,基本情况是当
n
时,答案是
n
,要得到
n
的最后一位,你需要
n%k
,所以递归情况是
cb(n//k,k)+[n%k]

代码如下所示:

def cb(n, k):
    if n < k:
        return [n]
    else:
        return cb(n//k, k) + [n%k]

print(cb(22, 3))
def cb(n,k):
如果n
如果你从递归的角度考虑,基本情况是当
n
时,答案是
n
,要得到
n
的最后一位,你需要
n%k
,所以递归情况是
cb(n//k,k)+[n%k]

代码如下所示:

def cb(n, k):
    if n < k:
        return [n]
    else:
        return cb(n//k, k) + [n%k]

print(cb(22, 3))
def cb(n,k):
如果n
最大的问题是您没有对递归调用的结果进行任何处理,因此它们永远不会出现在您的列表中。我想你也把这件事弄得太复杂了。像这样的方法应该会奏效:

def cb(n,k):
  if n > 0:
    q = n // k
    r = n - q * k
    b = cb(q, k)
    b.append(r)
  else:
    b = [0]

  if b[0] == 0 and len(b) > 1:
    b = b[1:]

  return b
我认为如果你不做最后一部分,那么你总是在前面得到一个0?您还可以进一步简化它,只需测试它是否小于基数,这就提供了一个更简单的解决方案

def cb(n,k):
  if n < k:
    return [n]
  else:
    q = n // k
    r = n - q * k
    b = cb(q, k)
    b.append(r)
    return b
def cb(n,k):
如果n
最大的问题是您没有对递归调用的结果进行任何处理,因此它们永远不会出现在您的列表中。我想你也把这件事弄得太复杂了。像这样的方法应该会奏效:

def cb(n,k):
  if n > 0:
    q = n // k
    r = n - q * k
    b = cb(q, k)
    b.append(r)
  else:
    b = [0]

  if b[0] == 0 and len(b) > 1:
    b = b[1:]

  return b
我认为如果你不做最后一部分,那么你总是在前面得到一个0?您还可以进一步简化它,只需测试它是否小于基数,这就提供了一个更简单的解决方案

def cb(n,k):
  if n < k:
    return [n]
  else:
    q = n // k
    r = n - q * k
    b = cb(q, k)
    b.append(r)
    return b
def cb(n,k):
如果n
它能工作吗?你怎么知道的?它的作用是什么?不,我的代码不起作用,事实上我不能用另一种方法…cb(a,k)
做什么?它起作用了吗?你怎么知道的?它对什么值起作用?不,我的代码不起作用,事实上我不能用另一种方法…cb(a,k)
做什么?