递归|Facebook,Linkedln面试高频题,没准哪天考到了

面试很多时候就看你会不会递归动规。其中,递归作为基础中的基础,可以说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,返回NK-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的课程,现在:

  1. 戳我免费试听后,加微信号jiuzhang15,回复「知乎递归」+试听截图;
  2. 邀请2位未注册过九章官网的新朋友入群,组成3人学习小组;

3人都可领全额抵价券,0元听课!

发布了438 篇原创文章 · 获赞 64 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/JiuZhang_ninechapter/article/details/103667015
今日推荐