第10课 函数与递归——自己调用自己课后练习--小学信息科技Python程序设计

资源下载
  1. 二一教育资源

第10课 函数与递归——自己调用自己课后练习--小学信息科技Python程序设计

资源简介

/ 让教学更有效 精品试卷 | 信息
第10课 课后练习
(答案版 · 教师用)
班级:____________ 姓名:____________ 得分:__________
一、填空(每空 3 分,共 24 分)
1.递归函数必须包含两个要素:______________ 和 ______________。
2.阶乘的递归公式是:fact(n) = n × ______________。
3.阶乘递归的出口应写成:if n == ______: return ______。
4.求 1+2+…+n 的递归写法中,出口是 n == 1 时返回 ______。
5.斐波那契数列的前两项都是 ______;从第三项起,每一项等于 ______________。
6.如果递归忘记写出口,程序会报 ______________ 错误。
二、判断对错(每题 3 分,共 12 分)
1.递归就是函数在内部调用自己。(  )
2.递归函数可以没有出口,只要问题足够简单。(  )
3.递归的执行过程是「先一层层往里调用,再一层层往外返回」。(  )
4.用递归和用循环都能解决的问题,递归一定更快。(  )
三、手算模拟题(16 分)
第 1 题 展开 fact(4) 的计算过程(fact 为阶乘函数)。
fact(4) = 4 * fact(3)
= 4 * (3 * fact(2))
= ...
请补完:
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
最终 fact(4) = ______。
第 2 题 下面程序的输出是什么?
def f(n):
if n <= 1:
return 1
return n + f(n - 1)
print(f(5))
调用 展开 结果
f(1)
f(2)
f(3)
f(5)
输出结果:______
四、★ 补全代码(每空 5 分,共 20 分)
第 1 题 递归求阶乘。
def fact(n):
if n == ①______:
return 1
return n * ②______________
print(fact(5))
第 2 题 递归求 1+2+…+n。
def total(n):
if n == 1:
return ③______
return n + ④______________
print(total(10))
① ______ ② ______ ③ ______ ④ ______
五、★★ 提高题(每题 10 分,共 30 分)
第 1 题 递归与循环的对比
用递归和用循环分别求 1×2×…×n,把两段代码都写出来,并说明在 n = 10 时两者结果是否相同。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 2 题 递归求各位数字之和
写一个递归函数 digit_sum(n),求一个正整数的各位数字之和。例如 digit_sum(12345) 应返回 1+2+3+4+5 = 15。
提示:n % 10 取出个位,n // 10 去掉个位。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 3 题 读程序写结果
def g(n):
if n == 0:
return 0
return n % 10 + g(n // 10)
print(g(708))
输出结果:______。请写出 g(708) 的三次调用展开过程:
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
六、★★★ 挑战题(每题 12 分,共 24 分)
第 1 题 斐波那契递归
用递归求第 n 项斐波那契数(前两项都为 1),输出前 15 项。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
思考题(附加 5 分):把 n 改成 35 再运行一次,你观察到什么现象?请写下你的猜测和理由。
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 2 题 递归求最大公约数(进阶)
辗转相除法的规则是:gcd(a, b) = gcd(b, a % b),当 b 为 0 时结果是 a。请用递归实现并测试 gcd(48, 36) 与 gcd(100, 75)。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
教师评语:
__________________________________________________________________
__________________________________________________________________
第 10 课 参考答案(教师用)
与《教师参考答案》册同源,全部数值均已实际运行核验
一、填空
1.终止条件(出口)、递归调用 2.fact(n - 1) 3.1、1 4.1
5.1、前两项之和 6.RecursionError(递归深度超出)
二、判断对错
1.√ 2.×(没有出口一定会无限递归报错) 3.√ 4.×(递归通常比循环慢,且占内存)
三、手算模拟题
第 1 题:
fact(4) = 4 * fact(3)
= 4 * (3 * fact(2))
= 4 * (3 * (2 * fact(1)))
= 4 * 3 * 2 * 1 = 24
第 2 题:f(n) = n + f(n-1),出口 f(1) = 1。
调用 展开 结果
f(1) — 1
f(2) 2 + f(1) 3
f(3) 3 + f(2) 6
f(5) 5 + 4 + 3 + 2 + 1 15
四、★ 补全代码
① 1 ② fact(n - 1) ③ 1 ④ total(n - 1)
五、★★ 提高题
第 1 题:递归版 n * fact(n-1);循环版用 ans = 1; for i in range(1, n+1): ans *= i。n = 10 时两者结果都是 3628800,完全相同。
第 2 题:
def digit_sum(n):
if n < 10:
return n
return n % 10 + digit_sum(n // 10)
第 3 题:输出 15。展开过程:
g(708) = 8 + g(70)
g(70) = 0 + g(7)
g(7) = 7 + g(0) = 7
→ g(70) = 0 + 7 = 7
→ g(708) = 8 + 7 = 15
六、★★★ 挑战题
第 1 题:
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
for i in range(1, 16):
print(fib(i), end=" ")
思考题:n = 35 时会非常慢(要等很久)。原因是递归会重复计算大量相同的项——fib(30) 在算 fib(35) 的过程中被重复调用了很多次,指数量级增长。
第 2 题:
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
print(gcd(48, 36)) # 12
print(gcd(100, 75)) # 25
21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)
21世纪教育网(www.21cnjy.com)/ 让教学更有效 精品试卷 | 信息
第10课 课后练习
(学生用)
班级:____________ 姓名:____________ 得分:__________
一、填空(每空 3 分,共 24 分)
1.递归函数必须包含两个要素:______________ 和 ______________。
2.阶乘的递归公式是:fact(n) = n × ______________。
3.阶乘递归的出口应写成:if n == ______: return ______。
4.求 1+2+…+n 的递归写法中,出口是 n == 1 时返回 ______。
5.斐波那契数列的前两项都是 ______;从第三项起,每一项等于 ______________。
6.如果递归忘记写出口,程序会报 ______________ 错误。
二、判断对错(每题 3 分,共 12 分)
1.递归就是函数在内部调用自己。(  )
2.递归函数可以没有出口,只要问题足够简单。(  )
3.递归的执行过程是「先一层层往里调用,再一层层往外返回」。(  )
4.用递归和用循环都能解决的问题,递归一定更快。(  )
三、手算模拟题(16 分)
第 1 题 展开 fact(4) 的计算过程(fact 为阶乘函数)。
fact(4) = 4 * fact(3)
= 4 * (3 * fact(2))
= ...
请补完:
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
最终 fact(4) = ______。
第 2 题 下面程序的输出是什么?
def f(n):
if n <= 1:
return 1
return n + f(n - 1)
print(f(5))
调用 展开 结果
f(1)
f(2)
f(3)
f(5)
输出结果:______
四、★ 补全代码(每空 5 分,共 20 分)
第 1 题 递归求阶乘。
def fact(n):
if n == ①______:
return 1
return n * ②______________
print(fact(5))
第 2 题 递归求 1+2+…+n。
def total(n):
if n == 1:
return ③______
return n + ④______________
print(total(10))
① ______ ② ______ ③ ______ ④ ______
五、★★ 提高题(每题 10 分,共 30 分)
第 1 题 递归与循环的对比
用递归和用循环分别求 1×2×…×n,把两段代码都写出来,并说明在 n = 10 时两者结果是否相同。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 2 题 递归求各位数字之和
写一个递归函数 digit_sum(n),求一个正整数的各位数字之和。例如 digit_sum(12345) 应返回 1+2+3+4+5 = 15。
提示:n % 10 取出个位,n // 10 去掉个位。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 3 题 读程序写结果
def g(n):
if n == 0:
return 0
return n % 10 + g(n // 10)
print(g(708))
输出结果:______。请写出 g(708) 的三次调用展开过程:
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
六、★★★ 挑战题(每题 12 分,共 24 分)
第 1 题 斐波那契递归
用递归求第 n 项斐波那契数(前两项都为 1),输出前 15 项。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
思考题(附加 5 分):把 n 改成 35 再运行一次,你观察到什么现象?请写下你的猜测和理由。
______________________________________________________________
______________________________________________________________
______________________________________________________________
第 2 题 递归求最大公约数(进阶)
辗转相除法的规则是:gcd(a, b) = gcd(b, a % b),当 b 为 0 时结果是 a。请用递归实现并测试 gcd(48, 36) 与 gcd(100, 75)。
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
教师评语:
__________________________________________________________________
__________________________________________________________________
21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)
21世纪教育网(www.21cnjy.com)

展开更多......

收起↑

资源列表