首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

为什么递归函数返回None

问: 有一个调用自己函数: def get_input(): my_var = input('Enter "a" or "b": ') if my_var !...: Type "a" or "b": a got input: a 但是,如果输入别的东西,然后输入 "a" 或 "b",我会得到这样结果: Type "a" or "b": purple You...Type "a" or "b": a got input: None 不明白为什么 get_input() 函数返回是 None,因为它本应只返回 my_var。这个 None 是从哪里来?...该如何修复函数呢? 答: 它返回 None 是因为当你递归调用它时: if my_var != "a" and my_var !...因此,尽管递归确实发生了,但返回值却被丢弃了,然后你会从函数末尾退出。在函数末尾退出意味着 Python 会隐式地返回 None,就像下面这样: >>> def f(x): ...

8710

为什么要创建一个不能实例化

但如果有一天,你发现写了这样一个类: class People: def say(self): print(f'叫做:{self.name}') def __new...一个不能初始化类,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...为了保留多继承优点,但又摒除缺点,于是有了混入这种编程模式。 Mixins 是一个 Python 类,它只有方法,没有状态,不应该被初始化。它只能作为父类继承。...不同 Mixin 方法互不重叠。...显然,这样写会报错,因为两个类实例是不能比较大小: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指某人年龄比另一人年龄大。

3.4K10

OpenCV论道:为什么伽马校正函数只有一行?

大家好,又见面了,是你们朋友全栈君。...最近在用 OpenCV 识别棋盘棋子,基本思路是这样:先转灰度,再做高斯模糊和二值化,此时棋盘格上有的有棋子,有的无棋子;通过迭代腐蚀,消去棋子,再迭代膨胀回来,就得到了一个纯净棋盘;识别棋盘,标定位置...就是提升图像暗部细节。这与加曝处理是不一样,加曝一般不区分图像暗部和亮部。...奇怪是,在网上搜到伽马校正函数看起来都很复杂,即便是 python 写,也都得十几行甚至几十行,可我写伽马校正函数只有一行。为什么会这样呢?是理解不对吗?...、伽马校正(gamma=2)灰度二值化效果、伽马校正(gamma=3)灰度二值化效果: 对于彩色图片,这个伽马校正函数依然有效。

1K20

为什么校招面试中“线程与进程区别”老是问到?该如何回答?

除此之外,推荐看一下阮一峰一篇博客:进程与线程一个简单解释,用图解释十分生动形象。 为什么这个问题是面试高频? 既然这个问题是面试当中会被经常问到,所以我去网上找一个答案,背出来不就好了。...我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念重复。 那么,他究竟想考什么?...在这里插入图片描述 同理,上图我们知道线程包含: 栈(堆栈):主线程main函数、进行函数调用参数和返回地址、局部变量等内容都会被压入栈内 PC(Program Couner):程序计数器,PC指针指向代码所在内存地址...总结 总之,如果上述内容你都了解,那肯定是不怕问到(大佬,请收下膝盖);如果看了此篇文章之后,你能答出个大概,相信面试官也会放过你,毕竟,我们也真的不是背书机器。...如果你能看到这,能否给我点个关注,点个赞让也收到鼓励。如果觉得内容有误,也欢迎评论指出。 注意,要敲黑板啦。 ? th (2).jpeg 进程是什么?它指的是一个运动中程序。

1.1K30

【算法-字节笔试-中等难度】Tarjan算法求解公共祖先问题LCA,并介绍倍增算法

递归直接爆栈,用stack写递归有一个点,改进优化了一下有两个点…… 印象中这个算法挺简单,就搜了一下,果然找到了。不是,现在校招算法题都这么丧病了吗。 由于保密协议,不能放代码。...伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u,v) //访问所有u子节点v { Tarjan(v);...//继续往下遍历 marge(u,v); //合并v到u上 标记v访问过; } for each(u,e) //访问所有和u有询问关系e...{ 如果e访问过; u,e最近公共祖先为find(e); } } 具体实现代码 #include #include <vector...50007 using namespace std; std::vector v[MXN];//邻接表写法 std::vector w[MXN]; //fa表示亲缘数组,cost表示每一代价

21810

c语言从入门到实战——函数递归

递归与迭代 递归是一种很好编程技巧,但是很多技巧一样,也是可能误用,就像举例1一样,看到推导公式,很容易就被写成递归形式: int Fact(int n) { if(n<=0) return...,是我们很难接受,这也说明递归写法是非常低效,那是为什么呢?...我们可以作业测试: #include int count = 0; int Fib(int n) { if(n == 3) count++; //统计第3个斐波那契数计算次数...分析: 本题实质上就是一个斐波那契数列问题,当台阶数为1或2时,法分别为1和2,当台阶数为n时,第一步可以选择1级或者2级,所以n级台阶法总数就是n-1级台阶法总数加上n-2级台阶法总数...我们在 main 函数中调用 jumpFloor 函数,并将结果输出到控制台。当n等于5时,输出结果为:跳上5级台阶共有8种法。

9810

c语言三种语句

,然后根据编程思维写出来,利用if语句和scanf函数这个题很简单 ​ else语句 ​ ​ #include int main() { int age = 0; scanf("%d,...(2)Tip:if和 eise if嵌套 if else语句中else中能穿插 if吗?答案是 能。这就是接下来介绍if嵌套,构成多重判断。...所以 break 作⽤就是永久终⽌循环,只要 break 执⾏, break 外第⼀层循环就终⽌了。...和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就 出循环; ⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后判断表达式...如果觉得文章还不错的话,可以三连支持一下,您支持就是前进动力! ​

8810

计算机初级选手成长历程——青蛙跳台阶问题详解

在上一篇内容中,我们把汉诺塔问题从头到尾剖析了一遍,自己在剖析过程中,对这个问题理解也得到了提升,不知道朋友们你们在看完上一篇内容有什么感受,今天我们来解决第二个经典问题——青蛙跳台阶问题。...int n = 0; //通过输入函数进行赋值 scanf("%d", &n); //通过传值调用,将实参n值传给jump函数 int m = jump(n); printf("青蛙跳%...n项变量 int n = 0; //通过输入函数进行赋值 scanf("%d", &n); //通过传值调用,将实参n值传给jump函数 int m = jump(n); printf(...这是为什么呢?...,它综合性体现在可以通过多种方式去实现,咱们这里使用函数递归与迭代方式,这里涉及到函数知识点有: 函数组成 函数参数 函数传值调用 函数声明与定义 函数递归与迭代 结语 到这里咱们本章内容就全部结束了

23660

C语言:函数递归

在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间 各种局部变量值,这块空间被称为运⾏时堆栈,或者函数栈帧。        ...函数不返回,函数对应栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。      ...#include int count = 0; int Fib(int n) { if(n == 3) count++;//统计第3个斐波那契数计算次数 if(n<=2)...六、递归拓展问题 6.1 青蛙跳台阶问题 一个青蛙,一次只能一个台阶或者两个台阶,求n个台阶有几种法??...分析: n=1,1次一个台阶,即jump(1)=1 n=2,可以2次一个台阶,也可以直接两个太极,即jump(2)=2 n=3,可以3次一个台阶,或者先跳1个台阶再2个台阶,或者先跳2个台阶再

8910

Codeforces Round #668 (Div. 2)A-D

A.tation Forgery 题意: 给出一个长度为 n 排列,排列 p 定义是,对于任意一个 p[ i ] 来说,其取值范围为 [ 1 , n ] ,且任意两个元素互不相等题目规定函数 ,...思路: 看到第一个样例就不难想到其中一个构造方法是将排列 p 翻转后直接输出,将排列 p 反转后得到 p' ,将其带入 F 函数得到 不难看出排序后两个排列 F 是相同,故直接将排列 p 翻转输出即可...,按照自己理解AC这个题)个人理解:A 和 B 两个人在一棵 n 个点树上玩游戏,初始时 A 在点 a ,B 在点 b ,树上每条边边权都为 1 ,每次 A 可以移动到距离不超过 da 顶点...树直径 > da * 2 其余情况都是 A 获胜稍微解释一下为什么是这样吧,第一个情况不用解释了吧,如果开局 A 就可以追上 B 的话,那显然 A 是必胜,只有当开局 A 无法追到 B 且 db...> 时,B 才可以像样例 2 那样一直 “反复横”,以至于 A 永远抓不到 B,不过别忘了 B 可以反复横前提还需要满足,在树上存在着这样一条链可以让他不断,贪心去想,找到树上最长链作为这条链是最优

50830

C语言-递归和迭代

本节概要 递归概念 递归:函数自己调用自己 控制台运行结果: 递归思想 把一个大型问题层层转换成一个与原问题相似,但规模较小子问题求解;直到子问题不能再被拆分,递归就结束了.--- 大事化小 递归...而在第二个例子中,虽然使用是整数变量,但因为将运算结果存储在浮点数变量中,所以结果转换为浮点数 2.0。在第三个例子中,被除数和除数都是浮点数,所以结果保留小数部分,为浮点数 2.5。...这是刚刚打印,1234例子,我们通过函数内存中栈区去观察,它是如何进行打印,当执行完所有函数以后我们会发现栈区里会给每一个执行完函数开辟一个空间,直到函数执行完以后,这些空间才会被一个一个释放出来...如果这个打印数字很大,比如说 n = 10000 栈内存没有那么大,就会导致在后面继续开辟内存空间时候,栈区没有足够空间提供给函数进行栈帧开辟,就会发生栈溢出(stack over flow)现象...2.青蛙跳台阶问题 有一只青蛙,一次可以一个台阶,也可2个台阶如果有n个台阶,这只青蛙有多少种法,跳上n个台阶

11310

分支和循环语句(3)

退出游戏 int input = 0; //time函数可以返回一个时间戳 srand((unsigned int)time(NULL));//要给srand传递一个变化值,计算机上时间是时刻发生变化...() { printf("hehe\n"); goto flag;//goto 语句只能一个函数内部跳转,不能跨函数跳转 return 0; } 从理论上, goto语句是没有必要,实践中没有...20] = { 0 }; //程序倒计时关机 system("shutdown -s -t 60"); again: printf("请注意,你电脑在1分钟内关机,如果输入:是猪,就取消关机...\n"); scanf("%s", input);//输入 if (0 == strcmp(input, "是猪")) { system("shutdown -a"); } else...1分钟内关机,如果输入:是猪,就取消关机\n"); scanf("%s", input);//输入 if (0 == strcmp(input, "是猪")) { system(

10410

LCA详解_lca软件

大家好,又见面了,是你们朋友全栈君。...举个例子,如下图:当u=1,v=4时,在后序遍历过程中,访问u时,v已经访问过了,已访问节点集合{4,7,5}祖先节点就是1,俩者相等,所以就是集合{4,7,5}祖先;再当u=7,v=4时,访问...如果节点v没有访问过,那我们就不用做处理,等到下次访问到节点v时,节点u已经处理了,按上面的方式进行理。 在实际实现过程中,我们需要记录集合祖先。...而跳表解法时间复杂度是o(logn),因为它时候是按2次幂,下面详细为大家解答。...) { int u, v; scanf("%d%d", &u, &v);//查询u和vLCA printf("%d和%d最近公共祖先为:%d\n", u, v, query(u, v)); } return

47030

【C++】命名空间&缺省参数&函数重载&引用&内联函数

函数重载 6-1.面试题: 6-1-1.为什么C语言不支持重载,C++支持?C++是如何支持?...,这里两个scanf都是int类型变量,所以出错 //小结:如果就是想要达成本意这个目的,C语言明显做不到(有命名冲突问题),所以C++就使用namespace命名空间域来完善C }...6-1.面试题: 为什么C语言支持函数重载,而C++支持函数重载? extern "C'作用 6-1-1.为什么C语言不支持重载,C++支持?C++是如何支持?...extern "C",有同时有整体C++程序想使用这个extern "C"修饰过了中间件.这就可以将这个整体C++程序前加上extern "C". 7.引用 7-1.引用基本使用(reference...------>空间换时间所以适合将那些函数内部代码量比较少且频繁调用函数定义成内联。当把大函数定义成内联时,编译器直接不搭理你定义内联。

78830

【C语言】初学C语言经典题目(范围广,内容多)

scanf函数使用 先别着急,一开始,先来简单介绍一下scanf函数,我们都知道scanf函数是用来输入,比如想输入一个字符,一个数字,一串字符,一串数字等等这些。...但是,在这里并不是想说scanf怎么去使用,使用的话我们每一个都是会。之所以放在这里讲原因是因为在不同编译环境下,scanf可能会出现错误!什么错误呢?...好了,关于scanf函数一些问题就在这里说清楚了!正式开始我们主题把!...就已经说过了,这里再来看一遍我们代码: 其实要点就在于关机命令shutdouw -s -t以及取消关机命令shutdouw -a ---- 模拟实现strlen()函数 这里只说两种方法,其他方法就不展开说明了...这段代码逻辑很清晰,就是想让a、b、c从大到小输出嘛,交换封装成一个函数去调用就行了,来,我们看看运行结果是什么:  结果并没有达到我们预期效果,这是为什么呢?

1.5K30
领券