算法——从斐波那契数列谈起(一)

问题的开始

现在有一个数列 \(\mathcal{f} _x\)
满足

\[\mathcal{f} _x= \begin{cases} 1 & x=\{0, 1\} \\ \mathcal{f} _{x-1}+\mathcal{f} _{x-2} & otherwise \end{cases} \]

通俗来讲,这个数列就是当前项等于之前两项之和。
\(\mathcal{f}_x\mod m的值\)

递归

递归是函数自己调用自己的过程,是一种通过重复将问题分解为同类的子问题而解决问题的方法,和分治类似。

递归的递归定义:

递归就是一种通过递归来解决问题的方法。

这时你如果要理解递归,就必须了解定义中加粗的递归的定义,于是你去看递归的定义,为了理解递归的定义,就必须了解定义中加粗的递归的定义\(\dots\)

于是你渐渐悟出,递归就是自己解释自己,自己使用自己的意思。

事实上,递归在数学中也十分常见:

集合论对自然数的正式定义是:\(1\) 是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。

有限递归与无限递归

无限递归的例子:

从前有座山,山里有座庙。
庙里有个老和尚在给小和尚讲故事。
故事讲的是:
从前有座山,山里有座庙。
庙里有个老和尚在给小和尚讲故事。
故事讲的是:\(\dots\)

没有终止,无穷无尽。

有限递归的例子:

你今年几岁?答:去年的岁数加一岁,2000 年我出生。

这次是有穷尽的递归,到2000年停止递归(2000年时1岁)。
这里2000年停止并返回1岁是递归的终止条件

代码的例子

int func(传入数值) {
  if (终止条件) return 最小子问题解;
  return func(缩小规模);
}

回到问题

说了这么多,在回来看一看我们斐波那契数列的问题:

这个数列就是当前项等于之前两项之和。

现在这个问题很明显是递归了,求第 \(x\) 项时先调用 \(x - 1\)\(x - 2\) 项。

代码
int fabbic(int x) {
    if (x == 0 || x == 1) 
        return 1; // 终止条件

    return fabbic(x - 1) + fabbic(x - 2); // 递归调用
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值