1. 程式人生 > >【27】Python100例基礎練習題6

【27】Python100例基礎練習題6

python range 函數 遞歸

例27:
題目:用遞歸的方法將輸入的字符,以相反的方式打印出來。
程序分析:
了解遞歸特性
1.必須有一個明確的結束條件
2.每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3.遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)

1.遞歸方法

def bar(s):
    if len(s)>0: #大於0
        print(s[-1])  #打印最後一個
        bar(s[0:-1])  #返回剩下的字符串
s=input("string>>>") ##輸入
bar(s)##s 賦值給函數bar

2.不用遞歸方法:(這裏需要函數reverse())

s=input("Input in string>>>").strip()
l=list(s)
l.reverse()
for i in range(len(l)):
    print(l[i])
print(l)

例28
題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大?
程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。

程序分析:
逆向思維,假設第1個人歲數是N,那第五個就是N+2+2+2+2

1.沒用遞歸方法

def boo(n):  ##n=10 ,第一個人歲數
    for i in range(1,5):  ###用range循環四次,1,2,3,4
        n=n+2
        print(n)
boo(10)

2.遞歸方法

def age(n):
    if n==1:
        return 10
    if n>1:
        return (n-1)*2+10  ##每人間隔兩歲,所以第五個跟第一個相差8歲,在加上10得第五人
print(age(5))

例29:
題目:

給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
程序分析:學會分解出每一位數。

n=input("輸入五位數字")
for i in range(len(n)-1,-1,-1):
    print(len(n),n[i])
看幫助手冊了解range函數用法,看順便可以提高英語閱讀能力。
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return an object that produces a sequence of integers from start (inclusive)
 |  to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
 |  start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
 |  These are exactly the valid indices for a list of 4 elements.
 |  When step is given, it specifies the increment (or decrement).
 |  
 |  Methods defined here:
 |  
 |  __bool__(self, /)
 |      self != 0
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(self, key, /)
 |      Return self[key].
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __hash__(self, /)
 |      Return hash(self).
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __len__(self, /)
 |      Return len(self).
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  __reduce__(...)
 |      helper for pickle
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __reversed__(...)
 |      Return a reverse iterator.
 |  
 |  count(...)
 |      rangeobject.count(value) -> integer -- return number of occurrences of value
 |  
 |  index(...)
 |      rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.
 |      Raise ValueError if the value is not present.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  start
 |  
 |  step
 |  
 |  stop

例30:
題目:一個5位數,判斷它是不是回文數。即12321是回文數,個位與萬位相同,十位與千位相同。
程序分析:所謂回文數字,其實就是一個數等於它的相反數,這是只要能將輸入內容相反一下等於本身即是回文數。

x=input("Please number:")
y=x[::-1]  ####y=x的倒數,當x輸入12345,x[::-1] == 54321
if x==y:
    print("回文數",x)
else:
    print("非回文數",y)

經驗總結:一個程序的難易度往往在於你的分析能力,能否一針見血直至核心很關鍵,這個還是需要多多練習才醒。

http://www.runoob.com/python/python-100-examples.html

【27】Python100例基礎練習題6