爬虫俱乐部之前推出的线下培训,得到了各位老师的一致好评。为了更加方便大家学习,满足更多Stata用户的学习需求,爬虫俱乐部近期即将推出在线直播课程,敬请大家关注!
有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
哈喽,诸君安!在介绍今天的推文之前呢,我先给大家讲一个小故事。故事就是在介绍推文之前先给大家讲一个小故事。故事内容就是,在介绍推文之前,我先给大家讲一个小故事……
哈哈……大家猜出来今天推文的主题了吗?没错,今天的重点就是递归思想。
首先说明一下,递归是一种算法。程序调用自身的编程技巧被称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
构成递归需具备的条件:
1、子问题须与原始问题为同样的事,且更为简单。
2、不能无限制地调用本身,须有个出口,化简为非递归状况处理。
举一个兔子繁殖的小例子。假如兔子在出生两个月时,就有繁殖能力,一对兔子每个月能生出一对小兔子来(仅有一只是母兔)。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
这是一个典型的斐波纳契数列问题,运用的就是递归思想,那么我们如何运用程序实现这个问题呢?首先我们来分析一下:
第一个月,小兔子没有繁殖能力,所以还是一对;
第二个月,生下一对小兔子,总数共有两对;
第三个月,老兔子又生下一对,因为小兔子还没有繁殖能力,总数共是三对;
第四个月,老兔子又生下一对,第二个月的小兔子也生下一对,总数共是五对;
依次类推……
我们发现,从第三月开始的兔子总对数等于前两个月的兔子总对数之和。
命令如下:
cap program drop recursion //如果内存中已经定义过名为recursion的函数,删除该函数
program define recursion, rclass //定义函数recursion,该函数的其返回格式为r()
if `1' == 1 return scalar recursion = 1 // 第一个月是1对兔子,`1’ 来声明命令recursion的参数。
elseif `1' == 2 return scalar recursion = 2 //第二个月是2对兔子
else{
recursion `=`1' - 1'
local i = r(recursion)
recursion `=`1' - 2'
local j = r(recursion)
return scalar recursion = `i' + `j' //大于2个月时,兔子总对数是前两个月的兔子对数的个数
}
end
recursion 12 //求解半年后兔子的总对数
return list
结果为:
这样,我们就很快算出了1年后的兔子总对数。当然,还有我们常见的阶乘,也是运用递归的思想,程序实现如下:
cap program drop factorial
program define factorial, rclass //定义函数factorial
if `1' == 1 return scalar factorial = 1 //1的阶乘等于1
else {
factorial `=`1'-1'
return scalar factorial = `1'*r(factorial)
} //当参数大于1时,返回值是该参数乘以上一个函数值,正好是阶乘求解的展开式。
end
factorial 10 //计算10的阶乘
return list
结果如下:
我们可以得到10!等于3628800。前期推文中我们已经多次介绍Mata的相关知识点,这里的递归思想,同样可以在Mata中实现,以计算阶乘为例,程序如下:
mata
mata clear
real scalar fact(real scalar n) { //定义函数fact,它的返回值类型是数值型标量,并且该函数的参数n也是数值型标量
if (n == 1) { //如果参数等于1,则返回1
return(1)
}
return(n*fact(n - 1)) //参数值大于1时,返回值为该参数乘以上一个函数值
}
fact(10) //求解10的阶乘
end
结果如下:
怎么样,有没有很惊喜!有没有很意外!是不是觉得很简单呢!另外,在Stata中是没有专门计算阶乘的函数哦,如果你想在Stata中求解阶乘,可以参考这样的方法哦!
注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑:祁让坤
技术总编:刘贝贝
往期推文推荐:
2.hello,MySQL--Stata连接MySQL数据库
3.hello,MySQL--odbcload读取MySQL数据
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


