C++ 实现数学归纳法证明过程

数学归纳法证明一般步骤

  1. 证明基本情况(通常是 n = 1的时候)是否成立;
  2. 假设 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;
}

测试结果

测试程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值