2 baby00qi baby00qi 于 2016.03.06 21:50 提问

C语言 递归,好像跳不出递归循环了,求大神帮忙看看

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

int num_pi=0;
int num_yin=1;
int money = 823;

int fun(int mon);
int main()
{
    fun(0);
    return 0;
 } 
int fun(int mon)
 {
    if(mon > money)
        return 0;
    if(mon == money && num_pi<num_yin){
            printf("%d\n",num_pi);
            return 0;
     }
     num_pi++;
     fun(mon+23);
     num_yin++;
     fun(mon+19);
 }


6个回答

caozhy
caozhy   Ds   Rxr 2016.03.06 22:10
已采纳
 void foo(int beer, int beverage)
{
    if (beer < 0 || beverage < 0) return;
    if (beer * 23 + beverage * 19 == 823)
    {
        if (beer < beverage)
            printf("%d %d\n", beer, beverage);
    }
    if (beer * 23 + beverage * 19 < 823)
    {        
        foo(beer, beverage + 1);
    }
    else
    {
        foo(beer - 1, beverage);
    }
}
int main()
{
    foo(823 / 23, 0);
}
baby00qi
baby00qi 回复caozhy: 好的
接近 2 年之前 回复
caozhy
caozhy 回复baby00qi: 如果解决的话,给个采纳吧。
接近 2 年之前 回复
baby00qi
baby00qi 感谢(*^-^*)
接近 2 年之前 回复
u013596119
u013596119   Rxr 2016.03.06 22:17

加多一个条件,会快很多

 #include <iostream>
int num_pi=0;
int num_yin=0;
int money = 823;

int fun(int mon);
int main()
{
    fun(0);
    return 0;
 } 
int fun(int mon)
 {
    if(mon > money||num_pi>num_yin)
        return 0;
    if(mon == money && num_pi<num_yin){
            printf("%d\n",num_pi);
            return -1;
     }
     num_pi++;
     if(fun(mon+23)==-1){
        return -1;
     }
     num_pi--;
     num_yin++;
     if(fun(mon+19)==-1){
        return -1;
     }
     num_yin--;
 }
baby00qi
baby00qi 回复DarthHaric: 试了一下,果然是因为我省略判断的原因
接近 2 年之前 回复
baby00qi
baby00qi 回复DarthHaric: 可能我把递归部分的if判断省掉了,所以就一直输出了…… (。﹏。*)
接近 2 年之前 回复
u013596119
u013596119 我放上去的应该只会输出一次11,你那里跑是一直输出?
接近 2 年之前 回复
baby00qi
baby00qi 为什么会一直输出11呢?求解
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.03.06 22:11
caozhy
caozhy   Ds   Rxr 2016.03.06 22:12

思路,beer从大到小,beverage从小到大,如果多了就减酒,如果少了,就加饮料。

WinsenJiansbomber
WinsenJiansbomber   2016.03.07 01:28

递归解题有点暴力,需要枚举所有组合,除条件设置排除外。

u013596119
u013596119   Rxr 2016.03.06 22:07

貌似算法不怎么好,时间太久

 #include <iostream>
int num_pi=0;
int num_yin=0;
int money = 823;

int fun(int mon);
int main()
{
    fun(0);
    return 0;
 } 
int fun(int mon)
 {
    if(mon > money)
        return 0;
    if(mon == money && num_pi<num_yin){
            printf("%d\n",num_pi);
            return -1;
     }
     num_pi++;
     if(fun(mon+23)==-1){
        return -1;
     }
     num_pi--;
     num_yin++;
     if(fun(mon+19)==-1){
        return -1;
     }
     num_yin--;
 }
baby00qi
baby00qi 多谢啦~(*^▽^*)
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!