python版本答案,只是供有缘人图一乐。
目录
问题 A: 递归求和
问题 B: 倒序输出
问题 C: 递归计数
问题 D: Kimi数列
问题 E: 递归求和
问题 F: 填放金币
问题 A: 递归求和
题目描述:
使用递归编写一个程序,求:
S(n)=1-1/2+1/3-1/4+1/5-1/6+......
答案:
对于其他语言来说,这是一个简单的递归题。但是,对于python来说,递归都需要注意一下题目给的条件,判断一下递归深度。比如这题如果不做处理,部分数据就会超出递归深度,导致程序崩溃,然后WA。
递归:
import sys
sys.setrecursionlimit(1000000) # 调整递归深度
def fun(x: int):
if x <= 1:
return 1
elif x % 2 == 0:
return -1 / x + fun(x - 1)
else:
return 1 / x + fun(x - 1)
while True:
try:
n = int(input())
print("%.6f" % fun(n))
except:
break
非递归:
while True:
try:
n = int(input())
res = 0.0
for i in range(1, n + 1):
if i % 2 == 0:
res = res - 1 / i
else:
res = res + 1 / i
print("%.6f" % res)
except:
break
这也算一个忘记了的小坑点,遇见递归题目,数据范围大的尽量改写成非递归的形式。
问题 B: 倒序输出
题目描述:
使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。
答案:
递归:
def re(str1: str, n: int, ctl: int):
if n == 0:
print(str1[0], end='')
else:
if (ctl == 1) & (str1[n] == '0'):
pass
else:
print(str1[n], end='')
ctl = 0
re(str1, n - 1, ctl)
while True:
try:
string = input().strip()
re(string, len(string)-1, 1)
print()
except:
break
非递归:
while True:
try:
string = input().strip()
box = list(string)
box.reverse()
# print(box)
start = []
# print(start)
for i in range(len(box)):
if box[i].isalnum() and (box[i] != '0' or (box[i] == '0' and start) or i == len(box) - 1):
start.append(box[i])
print("".join(start))
except:
break
问题 C: 递归计数
题目描述:
编写一个递归程序,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。
答案:
递归:
import sys
sys.setrecursionlimit(1000000) # 调整递归深度
def fun(x: int):
if x < 0:
return 0
else:
if 'A' <= string[x] <= 'Z':
# print(string[x])
return 1 + fun(x - 1)
else:
return 0 + fun(x - 1)
while True:
try:
string = input()
print(fun(len(string) - 1)) # 下标范围
except:
break
非递归:
chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
# print(len(chars))
while True:
try:
string = input()
cnt = 0
for s in string:
if s in chars:
cnt += 1
print(cnt)
except:
break
问题 D: Kimi数列
题目描述:
Kimi最近在研究一个数列: * F(0) = 7 * F(1) = 11 * F(n) = F(n-1) + F(n-2) (n≥2) Kimi称之为Kimi数列。请你帮忙确认一下数列中第n个数是否是3的倍数。
答案:
递归:正常情况下,python的递归深度在900多,这题n<=30,可以不调用系统函数
def fun(x: int):
if x <= 0:
return 7
if x == 1:
return 11
return fun(x - 1) + fun(x - 2)
while True:
try:
n = int(input())
if fun(n) % 3 == 0:
print("Yes")
else:
print("No")
except:
break
非递归:
f = [7, 11]
for _ in range(2, 31):
f.append(f[-1] + f[-2])
# print(len(f), f)
while True:
try:
n = int(input())
if f[n] % 3 == 0:
print("Yes")
else:
print("No")
except:
break
问题 E: 递归求和
题目描述:
使用递归编写一个程序求如下表达式的计算结果: (1<n<=20)
S(n) = 1*4 + 4*9 + 9*16 + 16*25 + ... + ((n-1)^2)*n^2
输入n,输出表达式S(n)的结果。
答案:
递归:
nums = [i ** 2 for i in range(0, 21)]
def fun(x: int):
if x <= 2:
return nums[1] * nums[2]
else:
return nums[x] * nums[x - 1] + fun(x - 1)
while True:
try:
n = int(input())
print(fun(n))
except:
break
非递归:
while True:
try:
n = int(input())
res = 0
for i in range(1, n):
res = res + (i ** 2) * ((i + 1) ** 2)
print(res)
except:
break
问题 F: 填放金币
题目描述:
X星人在一艘海底沉船上发现了很多很多很多金币,可爱的X星人决定用这些金币来玩一个填格子的游戏。
其规则如下:第1个格子放2枚金币,第2个格子放5枚金币,第3个格子放10枚金币,第4个格子放17枚金币,第5个格子放26枚金币,以此类推。
请问放到第n个格子时一共放了多少枚金币?
请用递归编写一个程序统计第1个格子到第n个格子的总金币数量。
【友情提醒:请使用递归来实现】
答案:先是找每个格子金币数量的规律,不难发现是i的平方+1(i,为第i个格子),然后就是写代码了。
递归:
def fun(x: int):
if x <= 0:
return 0
else:
return fun(x - 1) + x ** 2 + 1
while True:
try:
n = int(input())
print(fun(n))
except:
break
非递归:
box = [i ** 2 + 1 for i in range(1, 101)]
# print(box)
while True:
try:
n = int(input())
print(sum(box[:n]))
except:
break