2017-04-23 30 views
0

我試圖做一個遞歸序列(必須這樣做)在哪裏我打印一個*後面是最後一個字符加上下一行中的下一個字符等。所以如果「你好」獲得通過,這將打印:通過遞歸打印字符串的一部分

* 
o 
ol 
oll 
olle 
olleH 

我的問題是,如何獲取的最後一個字符留下來,我如何才能明星先打印。我有它,所有的東西都是相反的打印,但只有一個字符和最後打印的星星。這是我的:

def reverse(s): 
    if len(s) == 0: 
     return ('*') 
    else: 
     print(s[-1]) 
     return reverse(s[0:-1]) 

謝謝!

回答

2

試試這個:

def reverse(s): 
    if len(s) == 0: 
     print(*) 
    else: 
     reverse(s[1:]) 
     print(s[::-1]) 

當字符串沒有長度時,它將打印*,否則它將遞歸調用少一個字符並打印反轉的字符串。

由於reverse('two')回溯:

 
Call - 'two' 
Call - 'wo' 
    Call - 'o' 
    Call - '' 
    Print - '*' 
    Return 
    Print - 'o' 
    Return 
    Print - 'ow' 
    Return 
Print - 'owt' 
Return 

呼叫作爲reverse('Hello')

+0

完美!謝謝你的解釋! – Bob

+0

@Bob歡迎您,但在StackOverflow上表達感謝的最佳方式是提供有用的答案,並按下複選按鈕接受答案,只要它解決了您的問題。 –

0

遞歸版本:

def reverse(s, length, iteration): 
    if iteration == 0: 
     return '*' + reverse(s, length, iteration+1) 
    elif iteration == length: 
     return s[::-1] 
    else: 
     return '%s\n' % s[length - iteration: length][::-1] + reverse(s, length, iteration+1) 

input = 'Hello' 
print(input, len(input), 0) 

發電機版本

def reverse(s): 
    print('*') 
    length = len(s) 
    for i in range(1, length + 1): 
     yield s[length - i: length][::-1] 


print('\n'.join(list(reverse('Hello')))) 
0

會打印:

olleh 
olle 
oll 
ol 
o 
* 

output=[] 
def reverse(s): 
    if (len(s)>0): 
     print(s[::-1]) 
     output.append(s[::-1]) 
     reverse(s[1:]) 
    else: 
     print('*') 
     output.append('*') 

reverse('hello')   
# if you do need the original order, see below 
for e in (output[::-1]): 
    print(e)