数学归纳法证明一般步骤
- 证明基本情况(通常是 n = 1的时候)是否成立;
- 假设 n = k - 1 成立,在证明 n = k 时也是成立的(k 为任意大于1的自然数)。
参考
极客时间程序员的数学基础课专栏第四讲
代码实现
- 头文件:mathematical_induction.hpp
#ifndef MATHEMATICAL_INDUCTION_H
#define MATHEMATICAL_INDUCTION_H
/**
* @description 数学归纳法证明
* @param State n=k时的状态值,需要有默认构造函数,默认构造函数构造出初始状态,即n=1时的状态值,且需要重载==运算符
* @param Hypothesis 需要证明的假设f(n),为函数对象
* @param StateTransitionFunc 状态转移函数,从n=k-1时的状态转移到n=k时的状态,为函数对象
*/
template <typename State, typename Hypothesis, typename StateTransitionFunc>
class MathematicalInduction
{
public:
/**
* @description 数学归纳法证明过程
* @param n n时刻
* @return bool n时刻假设f(n)是否成立
*/
bool prove(int n)
{
State state;
return prove(n, state);
}
/**
* @description 数学归纳法证明过程
* @param n n时刻
* @param state 返回n时刻的状态值
* @return bool n时刻假设f(n)是否成立
*/
bool prove(int n, State &state)
{
// 证明基本情况是否成立
if (n == 1)
{
state = State();
if (m_hypothesis(1) == state)
return true;
else
return false;
}
// 如果n=k-1时假设成立,则证明n=k时假设是否成立
else
{
// 当n=k-1时,假设是否成立
bool proveOfPreviousOne = prove(n - 1, state);
// 状态从n=k-1转移到n=k
state = m_transitionFunc(state);
// 当n=k时,假设是否成立
bool proveOfCurrentOne = false;
if (m_hypothesis(n) == state)
proveOfCurrentOne = true;
// 当n=k-1时假设成立,并且n=k时假设也成立,则命题成立
if (proveOfPreviousOne && proveOfCurrentOne)
return true;
// 否则不成立
else
return false;
}
}
private:
Hypothesis m_hypothesis;
StateTransitionFunc m_transitionFunc;
};
#endif
- 测试代码:test.cpp
#include "mathematical_induction.hpp"
#include <iostream>
#include <math.h>
using namespace std;
// 用数学归纳法证明等比数列f(n)=2^(n-1)的前n项和为2^n-1
// 状态
class State
{
public:
// 当n=k时,等比数列的值
long long currentNum;
// 指导n=k时,等比数列的和
long long sum;
State() : currentNum(1), sum(1) {}
bool operator == (const State &rhs) const
{
return (currentNum == rhs.currentNum) && (sum == rhs.sum);
}
};
// 命题
class Hypothesis
{
public:
State operator () (int n) const
{
State result;
result.currentNum = pow(2, n - 1);
result.sum = pow(2, n) - 1;
return result;
}
};
// 状态转移函数
class StateTransitionFunc
{
public:
State operator () (const State &state) const
{
State result;
result.currentNum = state.currentNum * 2;
result.sum = state.sum + result.currentNum;
return result;
}
};
int main()
{
MathematicalInduction<State, Hypothesis, StateTransitionFunc> induction;
bool isItEstablished = induction.prove(52);
cout << (isItEstablished ? "The proposition holds" : "The proposition does not hold") << endl;
return 0;
}