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