我正在创建两个函数,一个返回基数为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)+
答案 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 b
到base 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 q
,q=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'