首页 > 其他分享 >[CS61A] 学习记录六 Lab2 题解思路分享

[CS61A] 学习记录六 Lab2 题解思路分享

时间:2024-08-13 22:28:07浏览次数:9  
标签:return 函数 题解 CS61A Lab2 88 print 1000 lambda

前言

观前提示,笔者写的代码答案放在 GitHub仓库 中,此处仅记录过程与心得。

此外,请最好在尝试独立完成该任务后再看本文,否则就很可能失去了体验本项目精华的机会

正文

Q1: WWPD: Lambda the Free

有两个问题有点意思。

lambda 与参数

>>> b = lambda x: lambda: x  # Lambdas can return other lambdas!
>>> c = b(88)
>>> c
______

该问题看似只是普通的 lambda 中传 x,c 还传入了 x 参数值为 88

所以答案是 88 吗?

当然不是,这个问题结合下面这个问题就很显然了。

>>> c()
______

那么想清楚这个问题的关键,就在于能否分辨 c 和 c() 的含义。

把 88 代入 c 的 lambda 式子,可以换成

c = lambda : 88

本质上,c 其实还是个 lambda 式子,只不过无参数,所以直接调用 c 不会得到 88,还得象征性地传入无参数调用才行。

>>> print_lambda = lambda z: print(z)  # When is the return expression of a lambda expression executed?
>>> one_thousand = print_lambda(1000)
______

>>> one_thousand
______

这个 print_lambda 只是一个把传入参数直接 print 出来的函数罢了,那么第一个空当然是 1000 啦。

嗯嗯,对,不过重点是第二个空的答案,这个 print_lambda 到底把什么赋予给 one_thousand 了?

有同学会说,不是 1000 吗?

不是哟,之所以第一个空会是 1000,是因为在赋值的过程前,先执行尽右侧函数时,print 的。

排除了 1000,这又不是 Function(print_lambda 才是 Function,代入了参数后就不是啦),不是 Error,排除了所有可能,只能是 None 了。

想想也是,print 也没有返回,None 也是理所应当。

Q2: WWPD: Higher Order Functions

值得注意的就一个点

如果有 return 而无变量承接,那 return * 就会相当于 print(*)。

Q3: Lambdas and Currying

需要通过多个 () 调用,说明内部有几层 def。

Q4: Count van Count

要仔细看好,在测试里面,输入的 condition 的输入参数情况如何,输出如何。

Q5: Make Adder

不难,题目也说了,不会就放这个 视觉化网站 看看结果

Q6: Lambda the Environment Diagram

同 Q5

Q7: Composite Identity Function

本质就是让你写个函数,返回对于 n ,先 f 后 g 与 先 g 后 f 是否相等,同时用上题目里的 compose1 函数。

Q8: I Heard You Liked Functions...Q8

这个问题有点意思,题目本质是要求给个函数,可以自定义循环对一个数字按顺序循环执行的次数和数字大小。

陆爻齐的思路是,先写一个可以根据循环次数,返回应该执行函数的函数,比如 i == 1 时,返回 f1,i == 4 时,也返回 f1 这样。暂且叫 get_todo。

然后写个循环,i <= n,对数字 num,代入执行 n 次 get_todo(i) 函数,结束。

小结

听完课可以锻炼英语听力,同时也对这个 higher order function 有了更深的感触,期待后续课程:)

标签:return,函数,题解,CS61A,Lab2,88,print,1000,lambda
From: https://www.cnblogs.com/luyaoqi/p/18357822

相关文章

  • 洛谷P9573 「TAOI-2」核心共振 题解
    ProblemSolution很容易发现如果\(p\ge2n\)时「共振」的次数一定为\(0\),所以这时随便怎么输出都行。考虑一般情况。首先为\(p\)的倍数的数肯定无法与其他不是\(p\)的倍数的数组,所以先输出是\(p\)的倍数的数。然后可以想到只需要枚举一个\(i\)表示余数,发现只需要枚......
  • CF1393B Applejack and Storages 题解
    ProblemSolution注意到能拼出时必须要存在\(2\)组及以上的四个相同的木棍,或者\(1\)组及以上的四个相同的木棍和除此之外的\(2\)组及以上的两个相同的木棍。同时又注意到\(a_i\)很小,所以可以用桶统计,同时实时更新四个相同木棍的组数和两个相同木棍的组数即可。Code#in......
  • 洛谷P7767 DNA 题解
    ProblemSolution考虑DP。设\(dp_{i,0}\)表示前\(i\)个字符全为A的最小操作次数,\(dp_{i,1}\)表示前\(i\)个数全为B的最小操作次数。考虑转移。若当前位为A则\(dp_{i,0}=\min(dp_{i-1,0},dp_{i-1,1}+1)\),\(dp_{i,1}=\min(dp_{i-1,0}+1,dp_{i-1,1}+1)\);若当前位......
  • 洛谷P9539 「AWOI Round 2 B」树学 题解
    ProblemSolution题目要求字典序最小,所以一定要尽可能多的\(a\),而且要尽可能靠前。所以我们只需修改不是\(a\)的位置为\(a\)即可。但若\(a\)的个数比\(r\)大,我们就需要将多余的\(a\)手动改为\(b\)并在接下来的修改中保持不变,所以定义一个\(vis_i\)表示是否一定......
  • 洛谷P9541 「AWOI Round 2 D」数字三角形 题解
    ProblemSolution通过题目意思发现,有三种情况:没有旋转的初始情况旋转一次的情况旋转两次的情况我们考虑怎么处理初始情况,其他情况同理。首先,我们发现经过数和最大一定可以保证是每行的最大值的总和,所以只要计算最小的消耗就可以了。考虑DP,设\(dp_{i,j}\)表示从......
  • CF895B XK Segments 题解 二分
    题目链接:https://codeforces.com/problemset/problem/895/B题目大意给你一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。求数列中存在多少个不同的下标对\((i,j)\)满足如下条件:\(a_i\lea_j\)并且恰好有\(k\)个整数\(y\)满足\(a_i\ley\lea_j\)且\(y\)......
  • 题解:CF1957A Stickogon
    原地址:这里思路首先看样例41121162233339422224244首先可以肯定当\(t\)为\(1\)和\(2\)时不能组成多边形,易知要组成最多的多边形,三角形更有性价比,观察样例\(t\)为\(6\)可以发现,只要用相同的木棍除以\(3\)取整便是答案,可能会有人问了,那我用......
  • 题解:AT_abc352_c [ABC352C] Standing On The Shoulders
    原地址:这里大意几个吃饱了撑的巨人在玩叠罗汉,每个人踩在前一个人的肩膀上,求这个叠罗汉最高有多高。思路直接先求出所有巨人的肩高之和,然后再一个一个枚举看加上哪一个巨人的头高最大就行了。代码#include<iostream>usingnamespacestd;inta[200005],b[200005];intmain......
  • 题解:CF1971B Different String
    原地址:这里题意给出字符串\(s\),询问更改\(s\)的排列顺序后与原来的\(s\)是否不同,不同输出YES,否则输出NO。思路只要判断字符串中含有不同的字符即可。代码#include<iostream>#include<cstdio>usingnamespacestd;intmain(){ intt; scanf("%d",&t); while(t-......
  • 【题解】 [NOIP 2002 普及组] 产生数
    题目描述题目大意给定\(k\)个规则,规则为“使一位数可变换成另一个一位数”。求整数\(n\)根据规则经过若干次(可以为0次或多次)变化,能生成的整数个数。思路该题主要考察:Floyd传递闭包,高精度乘法。显而易见,规则具有传递性。举个例子,1可变换成2,2可变换成3,则1可变换成3。当然......