算法基础(II)-递归(回文、斐波那契、欧几里得算法、汉诺塔)

什么是递归?

递归(Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

递归是将一个大问题分解成小问题,任何递归函数都可以用迭代函数实现。递归一般比迭代开销更大,但是递归函数非常好理解它的意思。

用递归解决问题要注意终止条件,没有终止条件函数一直运行下去直到报错。

回文字符串

回文(palindrome)字符串是一个字符串从左到右读和从右到左读完全一样,比如abcba

用递归的方法怎么判断一个字符串是不是回文字符串?一个字符串是回文字符串那么它第一个字符就等于最后一个字符,第二个字符就等于倒数第二个字符...。那么什么是终止条件?那就是当一个字符串只有一个字符的时候(从左到右读和从右到左读完全一样)。

def pal(s):
    if len(s) <= 1: return True
    return s[0] == s[len(s) - 1] and pal(s[1:len(s) - 1])

阶乘

阶乘(factorial)是所有小于及等于该数的正整数的积。n的阶乘计为n!0! = 1,当大于0n!=n*(n-1)

def fac(n):
    if n == 0: return 1
    return n * fac(n - 1)

可以看到用递归的方式写非常的简单,表达的意思和定义它的意思一样。

斐波那契数列

斐波那契(Fibonacci)数列是递归的方法来定义的:

F_0 = 0; F_1 = 1; F_n=F_{n-1}+F_{n-2}

0,1,1,2,3,5,7... n大于2n等于前两个数的相加。

def fib(n):
    if n <= 1: return 0
    elif n == 2: return 1
    else: return fib(n-1) + fib(n - 2)

和定义的意思一样一目了然,虽然效率不高。

欧几里得算法

在数学中,辗转相除法,又称欧几里得算法(Euclidean algorithm),是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。

简单来说a,b的最大公约数等于其中较小数和两数的差的最大公约数,比如100,10它们的最大公约数为100-10,1090-10,10一直持续下去。也可以看出两个数的最大公约数等于较小数和较小数除以较大数的余数的最大公约数。

欧几里得算法将一个大问题不断缩小,直到小到我们可以轻松解决。

def gcd(a,b):
    if b == 0:
        return a
    return gcd(b, a % b)

汉诺塔

汉诺塔(港台:河内塔)是根据一个传说形成的数学问题:

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。

传说越南河内某间寺院有三根银棒,上串 64 个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。

image

用代码怎么表示n个圆盘是怎么移动的呢?

我们可以发现要把全部圆盘移动到目标柱就必须先把最大的圆盘移动到目标柱(因为大盘不能叠在小盘上面),然后把第二大的移动到目标柱上...这样一直持续下去直到所有圆盘放到目标柱上。

要把大的圆盘移动到目标柱就必须把它上面小的圆盘移动到备用柱(必须要解决这个子问题才能把大圆盘放到目标柱上),移动到备用柱后再把大圆盘放到目标柱上,最后把其他小圆盘放到目标柱,这样就OK了。

def hanoi(n, form, to, spare):
    if n == 1:
        print('从 %s 移动到 %s' % (form, to))
    else:
        hanoi(n-1, form, spare, to) # 除最底下的大圆盘把其他移动到备用柱
        hanoi(1, form, to, spare) # 把最底下的大圆盘移动到目标柱
        hanoi(n-1, spare, to, form) # 再把备用柱上的圆盘移动到目标柱
hanoi(3, '起始柱', '目标柱', '备用柱')

对于一个圆盘只需要一步(直接从从起始柱移动到目标柱)。

对于两个圆盘就需要把它上面的一个圆盘移动到备用盘,然后把最大的圆盘放到目标柱,最后把备用柱上的放到目标柱子上。一共是3步。

如果有三个圆盘就要把上面两个圆盘移动到备用柱子(把两个圆盘放到目标柱上需要3步),然后把最大的圆盘放到目标柱(需要1步),最后把备用柱上的放到目标柱子上(需要3步)。一共7步。

依次类推有n个圆盘就需要两倍n-1个圆盘需要的步数再+1。对于n个圆盘的步数就为2^n-1步。可以看出来它是指数复杂度

如果n等于64最少就需要移动2^{64}-1步,如果一秒钟能移动一块圆盘,仍将需 5845.54 亿年。目前按照宇宙大爆炸理论的推测,宇宙的年龄仅为 137 亿年。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 2,983评论 0 0
  • 前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 汉诺塔问题是来源于印度传...
    郎小凯阅读 743评论 0 1
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,318评论 0 2
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,360评论 0 5
  • 近日,郑州某空姐在飞完最后一趟航班后,在郑州航空港区通过滴滴叫了一辆车赶往市里,结果惨遭顺风车司机杀害。这...
    开往春天的绿萝阅读 97评论 0 0