递归算法--从自己的全世界路过

窝头最近很烦恼,昨天老师讲的递归算法,搞得一头雾水,心里想着咋就啪啪啪几下就给一个复杂的问题给解决了呢?于是,他准备去找他们班的学霸咸菜。
窝头:“咸菜你在干嘛?”。
咸菜没好气的说:“没看见我在学习么?”。
窝头想咸菜这是咋的啦,火气那么大,想着自己是来请教问题的也就没在意。舔着脸笑着说:“咸菜老妹啊,老师讲的递归没整明白,你给我指导指导呗!”。
咸菜看窝头一脸真诚的样子,就勉为其难的说:“好吧”。
于是,咸菜一边说一边敲着如下代码:
这里写图片描述

咸菜对窝头说:“看吧,是不是很简单,其实就是自己调用自己而已!”
窝头说:“自己调用自己听起来很酷,那它到底是怎么做到的呢”。
咸菜说:“知道你会这么问,我就给你画个图吧”。
这里写图片描述
咸菜说:“窝头你注意看,我们的函数一旦调用就会被加载到栈中,每个栈帧就代表被调用的函数,这些函数以先进后出的方式排列起来”
咸菜又说:“现在我们假设传入的参数是3的话,在计算method(3)的时候,函数的返回值是3*method(2),但是method(2)的值我们还不知道,那么我们就去调用函数求method(2)的值,这样就需要在栈上面从新开辟一块空间来计算,然后是method(1),这样不就递归下去了么,然后method(1),method(2),method(3),
依次初栈,就能返回method(3)的值了”
窝头,点头表示懂了点。
咸菜又跟窝头说:“但是,递归不是无限递归下去的,必须要有一个终止的条件,不然就永远循环下去了,再也跳不出来了”
窝头又有疑问了:“如果数据足够大的话,栈就需要不断的去开辟空间,栈的内存岂是迟早要放不下了?”
咸菜笑着说:“你还不算太笨,数据太大是会导致你说的情况发生,但是我们可以把代码这样改一下”
这里写图片描述
咸菜对窝头说:“你看出来了有啥不一样的么?”
窝头说:“是有些不一样,多传了一个参数并且最后直接返回一个函数了”
咸菜说:“是的,这样的话就只需要调用一个函数,只是每次传入的参数不一样罢了,以后不管你有多大都没问题了”
窝头:“nice!it’s amazing !”
咸菜:“这就是传说中的尾递归,只要函数执行最后的语句并且它的返回值不属于函数表达式的一部分,就是尾递归”
窝头:“咸菜你是我的偶像了!”
咸菜:“谁让呢整天不学习,天天泡妞啊,这都不会”
窝头不要脸的说:“以后我不在天天泡妞了,以后就泡你”
咸菜白了他一眼,转过身去说了一句:“那看你的本事了”
未完待续………
推荐:http://blog.csdn.net/qchengsj/article/details/37918083

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值