问题:
有这样一个问题,去水果摊买桃子吃,吃完之后三个桃核可以再换一个桃子。
假如现在买了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;
}