我正在尝试编写一个函数,使用Cantor Pairing函数将数字取消配对到相应的对。
示例:0 - > (0,0),1 - > (0,1),2-> (1,0),3 - > (0,2),4 - > (1,1)......
我使用while循环编写了如下代码:
def unpair(n):
current_sum = 0 #current sum to generate the list
num_counter = 0 #current num in list
while current_sum <= n:
c2 = current_sum # right cantor num
c1 = 0 # left cantor num
while c2 >= 0 :
if (num_counter == n):
return c1,c2
c2 -=1
c1 +=1
num_counter +=1
current_sum +=1
如何将其转换为递归程序? 我觉得基本情况应该返回(0,0),但不确定如何在维护所有计数器时定义递归步骤
答案 0 :(得分:2)
我认为您需要一个双重基础案例,因为(0, 0) -> (1, 0)
的转换与其他人不同
def unpair(n):
if n == 0:
return (0, 0)
elif n == 1:
return (1, 0)
else:
x, y = unpair(n-1)
if x == 0:
return (y+1, 0)
else:
return (x-1, y+1)
话虽如此,我会使用Inverting the Cantor Pairing中的等式来表示任何实际应用,尤其是那些可能关心大数字的应用。
import math
def unpair(n):
w = math.floor((math.sqrt(8*n + 1) -1) /2)
t = (w*w + w)/2
y = n - t
x = w - y
return (int(x), int(y))