递归法解决小学数学吃桃问题

问题:

有这样一个问题,去水果摊买桃子吃,吃完之后三个桃核可以再换一个桃子。
假如现在买了N个桃子,最多可以吃到几个桃子?

分析:

典型的递归解决问题。找出桃子数量、桃核数量和最终数量之间的关系,递归调用,便直接解决问题。

代码:

#include<iostream>
using namespace std;
int total = 0;
void com(int n,int m)        //n代表桃子数,m代表桃核数
{
	total += n;              //桃子总数
	if (n + m < 3)           //不够换一个桃子
		return;
	com(n / 3 , n % 3);      //递归
	
}
int main()
{
	int n;
	cin >> n;
	if (n < 3)               //开始桃子数量小于3,不够兑换桃子,输入数量即为总数
		total = n;
	else
		com(n,0);            //初始状态下桃核数量为0
	cout << total << endl;
	return 0;
}

我的思路刚开始是这样的:对桃子数量进行处理,也就是桃子吃完之后拿桃核换桃子,建立一个函数,对这个函数进行递归,便可以解决问题。代码写好之后自己想了几个测试用例试了一下,发现有问题。仔细分析之后发现自己太过马虎,将问题想的太简单了:比如说,刚开始3个桃子,吃完之后还可以再换一个,总共可以吃到4个,但是代码将数量小于3的直接视为不能兑换,导致出现问题;若是将兑换的加上之后,对于其他的例子也会提示错误。最后是将函数定义两个变量,一个是桃子数量,一个是桃核数量:刚开始时桃核为0;桃子数量就是兑换的,递归时,桃子数量变为桃核可以兑换而成的桃子数量,桃核数由0变为每次剩下的不够兑换的桃核数量,在函数开始时进行桃子总数的增量计算,而判定条件变为桃子数量加桃核数量。问题迎刃而解。

扩展代码:

这类代码可以解决一类问题:输入桃子数量,输入可以兑换一个桃子的桃核数量,提高代码的通用性:

#include<iostream>
using namespace std;
int t,total = 0;                   //t个桃核可以换一个桃子
void com(int n,int m)        //n代表桃子数,m代表桃核数
{
	
	total += n;              //桃子总数
	if (n + m < t)           //不够换一个桃子
		return;
	com(n / t , n % t);      //递归
	
}
int main()
{
	int n;
	cin >> n>>t;
	if (n < t)               //开始桃子数量小于3,不够兑换桃子,输入数量即为总数
		total = n;
	else
		com(n,0);            //初始状态下桃核数量为0
	cout << total << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Crazy__1/article/details/88698993