Python三元游历

时间:2016-10-14 09:41:26

标签: python recursion ternary

我正在创建两个函数,一个返回基数为10的三元表示,另一个使用递归返回三元数的基数10表示。例如,52将返回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)+

2 个答案:

答案 0 :(得分:0)

你的代码几乎就在那里。根据{{​​3}},这应该可以解决问题。

但是,您必须搜索&#34; 0&#34;在这个函数之外:正如你在代码中所做的那样,&#34; 0&#34;输出中没有跳过数字,而且数字应该有输出&#34; 120011&#34;会输出&#34; 1211&#34;例如。

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)

答案 1 :(得分:0)

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

您使用number n中的base b作为此123.这意味着n中的base 10等于1*b² + 2*b + 3。因此,从base bbase 10的转换是直截了当的:你取所有的数字并乘以正确的基数乘以它们。

现在进行反向操作:number n中有一个base 10,并希望在base b中将其设为base b。操作只是计算新基数中的每个数字。 (我假设我的结果只有三位数用于以下示例)所以我正在寻找d {,{1}}中的数字d2,d1,d0。我知道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来解决新的等式。 / p>

所有这一切都转化为你几乎拥有的代码:

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'