这次的内容是浅写一下这门课的第一次期中考试的内容,我觉得有些题目很有意思,并且Pamela教授写了一份关于关于考试的说明,我觉得很有意思,正好可以复习一下之前学过的内容,则此期中主要包括了高阶函数、递归、函数关系等内容,接下来我会挑一些我觉得有意思的题目分享一下。
试题和答案:https://inst.eecs.berkeley.edu/~cs61a/sp21/exam/sp21/mt1/61a-sp21-mt1_sol.pdf
解析: Midterm 1 Walkthrough | CS 61A Spring 2021
T1
给了一个系统环境图和对应的挖空的程序,题目如下:
其实可以理解为就是程序填空题,这个题比较好理解,因为给出了python tutor中执行情况,我们直接分析,最开始执行的是yo_函数,然后执行的是_yo函数,然后观察yo_函数的返回情况,肯定不是第二种的返回方式,可能是第一种或是第三种的返回方式,然后我们看最后额flo的传值情况,很显然第一个yo_函数的返回值还是一个函数,这是一个高阶函数的内容,所以推测其传入的值为-2和_yo,然后再根据选项中的值推断出后续的填空答案即可,这个题属于比较有趣的,需要仔细分析一下的题目;
T8
先看一下题目描述:
简单来说就是对于一个数的每一位进行替换,digit_replacer传入的是两个函数,如果有一位的数字满足第一个函数的条件,则对该位数字进行替换,否则不改变;这个题就是一个非常简单的逐位对数 *** 作的问题,有循环和递归两种方案;
首先是循环的写法:
def digit_replacer(predicate, transformer):
def func(n):
new_num = 0
ten_times = 0
while n > 0:
digit = n % 10
if predicate(digit):
digit = transformer(digit)
new_num += digit * (10 ** ten_times)
ten_times += 1
n = n // 10
return new_num
return func
然后是递归的写法:
def digit_replacer(predicate, transformer):
def func(n):
if n == 0:
return 0
else:
digit = n % 10
if (predicate(digit)):
digit = transformer(digit)
return fun(n // 10) * 10 + digit)
return func
T7
先看一下这个题:
其实跟我们课上讲的一个例题很像,本质上还是给定一个数,然后在一个三个数的列表中有几个能组成该数的方案。这个题我们还是考虑递归的 *** 作。
既然是递归 *** 作,我们就考虑一下退出条件,因为我们返回的构成所需数值的几种情况,所以当total_needed将为0时,说明这种组合方案是可以的,返回1即可,其他特殊情况则返回0;同时对于递归的选择,因为我们传入的参数total_needed和一个数的个数,所以最终的程序如下:
def measure_methods(total_needed, cup_sizes):
def helper(total_needed, current_index):
if total_needed == 0:
return 1
if total_needed < 0:
return 0
if len(cup_sizes) <= curr_i:
return 0
without_cup = helper(total_needed, curr_i + 1)
with_cup = helper(total_needed - cup_sizes[curr_i], curr_i)
return without_cup + with_cup
return helper_method_name(total_needed, 0)
最后这个题目挺有意思的,建议大家可以放到Python tutor里体会一下,然后消化一下相关的知识。
Online Python Tutor - Composing Programs - Python 3
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)