Python 三元递归

Python Ternary Rescursion

我正在创建两个函数,一个是 return 以 10 为基数的三进制表示,另一个是 return 使用递归的三进制数的 10 进制表示。例如 52 将 return 1221。现在,我已经记下了,但我不确定如何制作它。我主要对 2 在三元表示中的方面以及如何将其实现到代码中感到困惑。

def numToTernary(n):
 '''Precondition: integer argument is non-negative.
    Returns the string with the ternary representation of non-negative integer
    n. If n is 0, the empty string is returned.'''
    if n==0:
        return ''
    if n<3:
        return str(n)
    return numToTernary(n//3)+

您的代码就快完成了。根据 this question.

,这应该可以解决问题

但是,您必须在该函数之外搜索“0”:正如在您的代码中所做的那样,“0”数字在输出中没有被跳过,并且应该输出一个数字“例如,120011" 会输出 "1211"。

def numToTernary(n):
    '''Precondition: integer argument is non-negative.
    Returns the string with the ternary representation of non-negative integer
    n. If n is 0, the empty string is returned.'''
    if n<3:
        return str(n)
    return numToTernary(n//3)+str(n%3)

所以所有基础变化的主要想法如下:

你把写在 base b 中的 number n 作为这个 123。这意味着 base 10 中的 n 等于 1*b² + 2*b + 3 。所以从 base bbase 10 的转换是直接的:你把所有的数字都乘以基数的正确幂。

现在进行反向操作:您在 base 10 中有一个 number n 并且想要在 base b 中将其打开。该操作只是计算新基数中的每个数字的问题。 (对于以下示例,我假设我的结果只有三位数字)所以我正在寻找 d2、d1、d0 中 base b of n 中的数字。我知道 d2*b² + d1*b + d0 = n。这意味着 (d2*b + d1)*b + d0 = n 所以我们认识到欧几里得除法的结果,其中 d0 是 n 除以 d 的欧几里得除法的余数:d0=n%d。我们已将 d0 确定为余数,因此括号中的表达式是 quotien qq=n//b,因此我们有一个新方程可以使用完全相同的方法(因此递归)d2*b + d1 = q 求解。

所有这些都可以转化为您几乎拥有的代码:

def numToTernary(n):
    '''Precondition: integer argument is non-negative.
    Returns the string with the ternary representation of non-negative integer
    n. If n is 0, the empty string is returned.'''
    if n==0:
        return ''
    if n<3:
        return str(n)
    return numToTernary(n//3)+str(n%3)

print(numToTernary(10))
Out[1]: '101'