2015-03-25 113 views
0

我想要構建一個RECURSIVE函數,它採用自然數n並返回一個從0開始到n結束的數字元組。因此,rec_range(5)返回(0,1,2,3,4),rec_range(1)返回(0,)。返回元組的遞歸函數python

這是我到目前爲止有:

def rec_range(n): 
"""returns a tuple of numbers starting with 0 and ending before n 

natural number -> tuple of numbers""" 
    if n = 0: 
     return 0 
    else: 
     return rec_range(0, n) 

我不知道下一步該怎麼做。另外,應該注意的是我無法測試這個函數,因爲有一個無效的語法錯誤。

回答

1

在Python中,你可以連接元組與+

def rec_range(n): 
    if n == 0: 
     return (0,) 
    else: 
     return rec_range(n - 1) + (n,) 
+0

您選擇正確的,但有一個類型的錯誤...類型錯誤:不支持的操作數類型(S)爲+: '詮釋' 和 '元組' – holaprofesor 2015-03-25 02:37:16

+0

@JaredBanton'rec_range(10)'對我的作品在Python 2.7&3 – axblount 2015-03-25 02:41:39

+0

是的,它的工作原理...我的壞 – holaprofesor 2015-03-25 02:46:25

0

將rec_range(n)定義爲以遞增順序返回計數爲< n的元組。這模仿了自然數的集合論定義。除非講師授權不同,rec_range(0)應該(邏輯上)是一個空元組()。

元組的重複連接將O(n)函數(附加到列表)轉換爲O(n * n)函數。如果需要元組而不是列表,則轉換爲元組可能是最後一步。這是一個O(n)tail_recursive解決方案。

def rec_range(n, answer=None): 
    if answer is None: 
     answer = [] 
    if n > 0: 
     n -= 1 
     answer.append(n) 
     return rec_range(n, answer) 
    else: 
     return tuple(reversed(answer)) 

print(rec_range(0), rec_range(1), rec_range(10)) 
#() (0,) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)