【程序员必修数学课】->基础思想篇->递归(上)->泛化数学归纳

本文通过舍罕王与宰相达依尔的故事引入,探讨如何在限定总和条件下求加和问题。文章介绍了迭代法和递归法解决此问题,重点讲述了递归法的优越性,如何利用数学归纳法的思想进行递归编程,并指出递归在复杂问题分解中的重要性。最后,文章预告将深入讨论递归在分而治之策略中的应用。
摘要由CSDN通过智能技术生成

前言

在前几篇文章中我不断引用更改了国际象棋发明人被国王赏麦子的故事,这篇文章我还需要再借一下这两个人。

舍罕王和宰相达依尔来到了现代,这次舍罕王聪明了,他对宰相说,“这次我不用麦子赏你了,我直接给你发钱。另外,我也不用棋盘了,我直接给你一大笔固定数额的钱。”
宰相思考了一下,回答道:“没问题,陛下,就按照您的意愿。不过,我有一个小小的要求。能否您先列出所有可能的组合,让我自己来选呢?假设有四种面额的钱币,1元、2元、5元和10元,而您一共给我10元,那您可以奖赏我1张10元,或者5张1元加上1张5元等等……”

那么,如果考虑每次奖赏的金额和先后顺序,最终会有多少种不同的奖赏方式呢?

如何在限定总和的条件下求加和?

我们再帮国王想一想,要如何解决这个问题。

这个问题和棋盘的问题不同,它并不是要求总数,而是在总数限定的情况下,求所有可能的加和方式。

之前我写过的迭代法就是解决重复性操作的问题的,那我们先来看一看如何用迭代法解决。

迭代法

设 k 为每一次选择的次数,k = 1, 2, 3, 4, … n 。

当 k = 1时,即第一次选择,那么1元、2元、5元和10元这四种面值的都可以选择。
当 k = 2时,如果第一次选择的是 1 ,则这次有可能选1元、2元或者5元(如果选择 10,则超过了 10 元)。

按照这个思路,我们可以预见这个情况是十分复杂的。
在这里插入图片描述

这还只是奖金总额只有10元的情况。

所以虽然迭代法的思想是可行的,但是如果用循环来实现,必须要保存很多很多中间状态及其对应的变量。

因此,我们需要用另一个方法,递归法

递归法

在函数的递归中,每次嵌套调用都会让函数体生成自己的局部变量,正好可以用来保存不同状态下的数值,为我们省去了大量中间变量的操作,极大地方便了设计和编程。

在我的数学归纳法讲解的文章末尾,我提到了数学归纳法和递归调用的一致性,递归编程体现了数学归纳法的思想。那么如果我们把这个思想泛化一下,递归就会用更多、更广阔的应用场景。

那么,如何把复杂的问题简单化?

首先,我们来看,如何将数学归纳法的思想泛化成更一般的情况?

数学归纳法考虑了两种情况:

  1. 初始状态。也就是 n = 1 的时候,命题是否成立;
  2. 其他状态。如果 n = k -1 的时候,命题成立。那么只要证明 n = k 的时候,命题也成立。其中 k 为大于 1 的自然数。

将上述两点顺序更换一下,再进行抽象化,就有了下面这样的递推关系:

  1. 假设 n = k -1 的时候,问题已解决(或者已经找到解)。那么只要求解 n = k 的时候,问题如何解决(或者解是多少)。
  2. 初始状态,就是 n = 1 的时候,问题如何解决(或者解是多少)。

这种思想就是将复杂的问题,每次都解决一点点,并将剩下的任务转化成为更简单的问题等待下次求解,如此反复,直到最简单的形式。

回到开头的问题,我们再将这种思想具体化。

  1. 假设 n = k - 1 的时候,我们已经知道如何去求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值