将while循环转换为递归函数。 (康托配对)

时间:2017-09-30 19:05:30

标签: python recursion

我正在尝试编写一个函数,使用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),但不确定如何在维护所有计数器时定义递归步骤

1 个答案:

答案 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))