C++抽象编程——递归简介(3)——The recursive leap of faith

从上一篇的递归简介中的阶乘函数,我们可以看出来,计算机对待每一个fact函数都是一样的。至少从理论上,我们可以根据递归简介中的(2)的方法,找出并计算出其他递归程序的值。但如果你这样子做,你就会发现,程序分析过程变得异常的复杂难懂。还让你容易乱套。

The recursive leap of faith.

无论何时,当你试图去理解一个递归程序时,我们通常不去理解底层的细节,而是关注单独的一个运算的层次。此时,当被调用的内容比起原程序简单的时候,你可以假设每一个递归的程序都自动调用并且正确调用。这种假设每一个简单的递归程序都能正确调用的策略,我们称为recursive leap of faith(This psychological strategy—assuming that any simpler recursive call will work correctly—is called the recursive leap of faith)。这个想法在我们递归时候显得特别重要。学会应用这个策略在递归的练习应用中是非常必要的。

举个例子,考虑当n=4的时候程序是怎么执行fact(n)的。此时程序一定在计算下面的语句:

n * fact(n - 1).

通过代入n 我们可以知道结果就是:

4 * fact(3)

好,停在这里,我们可以发现,计算fact(3)比计算fact(4)更加简单。正是因为如此,recursive leap of faith 允许你假设它正常运行,因此,你可以假设调用fact(3)就会准确得出3!=3x2x1,或者是6。所以调用fact(4)=4x6=24.  所以一旦你能正确的递归分解并且区分simple case,计算机就可以完成计算。所以 ,我们应该尝试着关注大的部分而不是具体的细节

7.2 The Fibonacci function.

在1202年,有个意大利的数学家Leonardo Fibonacci,提出了影响了很多领域的数学问题包括计算机科学。Fibonacci问题关心的兔子的数目会怎么一代代的增长,如果兔子满足下列的条件:

• Each pair of fertile rabbits produces a new pair of offspring each month.
• Rabbits become fertile in their second month of life.
• Old rabbits never die.

(1)每一对的成年兔子每个月会生产一对后代

(2)兔子在出生后的第二个月成年

(3)兔子不会死亡

如果一月分的时候,这里有一对兔子降临,那么一年后这里会有多少对兔子呢?


你可以把它看做一个简单的计数问题,记下全年每个月的兔子的数量

1月 这里还没有兔子

2月 这里产生了第一对兔子

3月 这对兔子还未成年

4月 这对兔子成年并且生下一对新的兔子(两对)

5月 初代兔子再生一对,新的兔子还未成年

.................

我们为了方便的看出数据的变化规律,可以把数量记为一个表格,如下


单位是对(pari),我们可以通过观察得出下一个数字,因此我们可以通过手写,计算出这一年的兔子产生了多少对,如下


因此,一年可以产生144对兔子。我们也可以通过观察,使用更加数学化的形式来描述这一个规律:

(因为每一对兔子出生后都有两个月的未成年时间)

而满足这种关系的式子,我们就说他们满足递推关系(An expression of this type, in which each element of a sequence is defined in terms
of earlier elements, is called a recurrence relation.)。

单纯的上面的式子并不满足Fibonacci数列,因为公式虽然很好计算,但是必须从某个地方开始,也就是说,要计算其中一个的值,你就必须知道至少两个已知的元素,在这里变数第一跟第二的数字---t0  还有-----t1 了。因此,完整的Fibonacci数列公式为:


这个数学公式是一个fib(n)函数的思想模式,,我们用来计算第n次的Finonacci数列的值。

下一篇就开始由这个公式开始编码这个函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值