面试很多时候就看你会不会递归和动规。其中,递归作为基础中的基础,可以说99%的算法面试中会考到,如果因为递归问题挂掉面试,那就真的太可惜了。
递归虽然基础,但对初学者极度不友好,算法界流传着这样一句话:
To iterate is human, to recurse, divine. 人理解迭代,神理解递归。
学习递归,需要有意识的抛弃人类大脑惯有的“迭代”思维,逆向思考问题,也导致递归成为初学者学习算法的最大障碍之一。
什么是递归?
引用一个知乎高赞回答:
一个小朋友坐在第10排,他的作业本被小组长扔到了第1排,小朋友要拿回他的作业本,可以怎么办?
他可以拍拍第9排小朋友,说“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!
这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。
更严谨一些,递归蕴含的思想其实是数学归纳法:为了求解问题p(n),首先解决基础情形p(1),然后假定p(n-1)已经解决,在此基础上若p(n)得解,那所有问题均得解。
理论联系实际,今天我们来学习一道难度中等的递归题~
第K个语法符号
题目描述
在第一行,我们写一个0
。现在在之后的每一行,我们观察之前一行并且用01
替换出现的1
,用10
替换出现的0
。
给出行号N和索引K
,返回N
行K-th
索引的符号。(K
的值为1-indexed)。
1.N是一个[1,30]区间的整数。
2.K是一个[1,2^(N-1)]区间的整数。
样例1
输入:N = 1, K = 1
输出:0
解释:
行 1: 0
样例2
输入:N = 2, K = 1
输出:1
解释:
行 1: 0
行 2: 01
样例3
输入:N = 2, K = 2
输出:1
解释:
行 1: 0
行 2: 01
样例4
输入:N = 4, K = 5
输出:1
解释:
行 1: 0
行 2: 01
行 3: 0110
行 4: 01101001
考点
- 递归
- 思维
题解
row 1: 0
row 2: 01
row 3: 0110
row 4: 01101001
进行观察,对于每行第K个字符,如果K-1的二进制表示中有奇数个1时,返回1,如果有偶数个,返回0。
# This reference program is provided by @jiuzhang.com
# Copyright is reserved. Please indicate the source for forwarding
class Solution:
"""
@param N: the row
@param K: the index
@return: the K-th indexed symbol in row N
"""
def kthGrammar(self, N, K):
# Write your code here
return bin(K - 1).count('1') & 1 #求解K-1二进制中1 的个数为奇数还是偶数
此为Python解法,Java,C++解法请见Lintcode
想要更好地掌握这个知识点,欢迎免费加入《递归四讲》
这门原价$199的课程,现在:
- 戳我免费试听后,加微信号jiuzhang15,回复「知乎递归」+试听截图;
- 邀请2位未注册过九章官网的新朋友入群,组成3人学习小组;
3人都可领全额抵价券,0元听课!