21、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
分析:反向推断。猴子有一个桃子,他偷了一个桃子,觉得不够又偷了与手上等量的桃子,一共偷了9天
n = 1
for i in range(9):
n = (n + 1) * 2
print('一共有', n, '个桃子')
输出结果:
一共有 1534 个桃子
22、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
分析:利用集合特性,集合是一个无序的不重复的list。
a = set(['y', 'z']) #a不和x比
b = set(['x', 'y', 'z']) #b可以和任何一个人比
c = set(['y']) #c不和x,z比
for i in a:
for j in b:
for k in c:
#i、j、k组成一个长度为3的set,即每个人都有一个对手且不重复
if len(set([i, j, k])) == 3:
print('a-->%s, b-->%s, c-->%s' % (i, j, k))
输出结果:
a-->z, b-->x, c-->y
23、打印出如下图案(菱形):
*
***
*****
*******
*****
***
*
分析:找规律。
for i in range(-4, 5):
if i < 0:
j = -i
else:
j = i
print(' '*j + '*'*(9-2*j))
输出结果:
*
***
*****
*******
*********
*******
*****
***
*
24、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
a = 2
b = 1
s = 0
for i in range(0, 20):
s += a / b
a, b = a+b, a
print(s)
输出结果:
32.66026079864164
25、求1+2!+3!+…+20!的和。
n = 0
s = 0
t = 1
for n in range(1, 21):
t *= n
s += t
print('1! + 2! + 3! + ... + 20! =', s)
输出结果:
1! + 2! + 3! + ... + 20! = 2561327494111820313
26、利用递归方法求5!。
def f(n):
if n==1:
return 1
else:
return n * f(n-1)
print(f(5))
输出结果:
120
27、利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
def rec(string):
if len(string)!=1:
rec(string[1:])
print(string[0],end='')
rec(input('输入一个字符串:'))
输入abcde,输出结果:
输入一个字符串:abcde
edcba
28、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
分析:递归求等差数列。
def age(n):
if n==1:
return 10
return 2 + age(n-1)
print(age(5))
输出结果:
18
29、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
n = int(input('输入一个正整数:'))
n = str(n) #转换成字符,字符可用用len()函数求长度
print('%d位数'%len(n))
print(n[::-1])
输入12345,输出结果:
输入一个正整数:12345
5位数
54321
30、一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
n = input('请输入一个数字:')
l = len(n)
flag = True
for i in range(0, l):
if n[i] != n[-i-1]:
flag = False
else:
flag = True
if flag==True:
print('%s是回文数'% n)
else:
print('%s不是回文数'% n)
输入1234321,输出结果:
请输入一个数字:1234321
1234321是回文数