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 b
到 base 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 q
、q=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'
我正在创建两个函数,一个是 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 b
到 base 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 q
、q=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'