楼主: zhou1_20
3766 16

[问答] 用R编程实现下面这个有趣的生活问题 [推广有奖]

已卖:689份资源

副教授

20%

还不是VIP/贵宾

-

威望
0
论坛币
18999 个
通用积分
1029.7754
学术水平
146 点
热心指数
166 点
信用等级
135 点
经验
36357 点
帖子
541
精华
0
在线时间
887 小时
注册时间
2015-9-25
最后登录
2025-12-4

楼主
zhou1_20 发表于 2016-1-26 14:12:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
某人有100瓶酒,规定4个瓶盖换一瓶,2个空瓶换一瓶,问这个人一共可以得到多少瓶酒?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R编程 一瓶

已有 1 人评分论坛币 学术水平 收起 理由
jiangbeilu + 20 + 2 鼓励积极发帖讨论

总评分: 论坛币 + 20  学术水平 + 2   查看全部评分

本帖被以下文库推荐

沙发
hongweigg 发表于 2016-1-27 10:51:11
#拥有的酒(以瓶计,不包括瓶盖和瓶身,只代表酒)
liquor <- 0;

#递归函数,输入变量为酒瓶数(包含瓶盖、瓶身)
exchange <- function(wine){
        liquor <<- liquor + wine;
        addedLiquor = floor(wine*(0.25 + 0.5));
        cat("now own liquor number:",liquor,",addedLiquor number:",addedLiquor,"\n");
               
        if(addedLiquor>=1){
                exchange(addedLiquor);
        }
}

#赋初始值,并计算
wine <- 100;
exchange(wine);

#打印结果
cat("total liquor number:" ,liquor,"\n");

输出结果:
now own liquor number: 100 , addedLiquor number: 75
now own liquor number: 175 , addedLiquor number: 56
now own liquor number: 231 , addedLiquor number: 42
now own liquor number: 273 , addedLiquor number: 31
now own liquor number: 304 , addedLiquor number: 23
now own liquor number: 327 , addedLiquor number: 17
now own liquor number: 344 , addedLiquor number: 12
now own liquor number: 356 , addedLiquor number: 9
now own liquor number: 365 , addedLiquor number: 6
now own liquor number: 371 , addedLiquor number: 4
now own liquor number: 375 , addedLiquor number: 3
now own liquor number: 378 , addedLiquor number: 2
now own liquor number: 380 , addedLiquor number: 1
now own liquor number: 381 , addedLiquor number: 0
total liquor number: 381
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

藤椅
男孩泪 发表于 2016-1-27 10:56:15
hongweigg 发表于 2016-1-27 10:51
#拥有的酒(以瓶计,不包括瓶盖和瓶身,只代表酒)
liquor

板凳
zhou1_20 发表于 2016-1-27 12:13:26
hongweigg 发表于 2016-1-27 10:51
#拥有的酒(以瓶计,不包括瓶盖和瓶身,只代表酒)
liquor
你这种方法算出结果有问题, 当 wine=5 时可以算得正常结果为15,而你的方法是11

报纸
zhou1_20 发表于 2016-1-27 12:14:33
#酒瓶问题
interestproblem <- function (x) {
        a=x;b=a;c=a
        while (b >= 4 | c >= 2) {
          if (b >=4) {
         b1=b-b%%4
         a=a+b1/4
         b=b-b1+b1/4
         c=c+b1/4
         } else {
             if (c >=2 ){
                 c1=c-c%%2
                 a=a+c1/2
                 b=b+c1/2
                 c=c-c1+c1/2
              } else {
              a=a
                b=b
                c=c
              }
            }
      }
      return(data.frame('酒瓶'=a,'瓶盖'=b,'空瓶'=c))
      #return(c(a,b,c))

}
interestproblem(100)


地板
hongweigg 发表于 2016-1-27 13:04:35
zhou1_20 发表于 2016-1-27 12:13
你这种方法算出结果有问题, 当 wine=5 时可以算得正常结果为15,而你的方法是11
原程序确实有些问题,丢掉了一些未能整换的”零头“,下面进行了修正:

#拥有的酒(以瓶计,不包括瓶盖和瓶身,只代表酒)
liquor <- 0;

#递归函数,输入变量为酒瓶数(包含瓶盖、瓶身)
exchange <- function(wine,bottle,cap){
        liquor <<- liquor + wine;
        tmpBottle <- floor((wine+bottle)*0.5)
        tmpCap <- floor((wine+cap)*0.25)
        addedLiquor = tmpBottle + tmpCap;
        remainingBottle <- (wine+bottle) - tmpBottle*2;
        remainingCap <- (wine+cap) - tmpCap*4;
        cat("now own liquor number:",liquor,", addedLiquor number:",addedLiquor,"\n");
               
        if(addedLiquor>=1){
                exchange(addedLiquor,remainingBottle,remainingCap);
        }
}

#赋初始值,并计算
wine <- 100;
exchange(wine,0,0);

#打印结果
cat("total liquor number:" ,liquor,"\n");

运行结果为:
now own liquor number: 100 , addedLiquor number: 75
now own liquor number: 175 , addedLiquor number: 55
now own liquor number: 230 , addedLiquor number: 42
now own liquor number: 272 , addedLiquor number: 32
now own liquor number: 304 , addedLiquor number: 24
now own liquor number: 328 , addedLiquor number: 18
now own liquor number: 346 , addedLiquor number: 13
now own liquor number: 359 , addedLiquor number: 9
now own liquor number: 368 , addedLiquor number: 8
now own liquor number: 376 , addedLiquor number: 6
now own liquor number: 382 , addedLiquor number: 4
now own liquor number: 386 , addedLiquor number: 3
now own liquor number: 389 , addedLiquor number: 2
now own liquor number: 391 , addedLiquor number: 1
now own liquor number: 392 , addedLiquor number: 2
now own liquor number: 394 , addedLiquor number: 1
now own liquor number: 395 , addedLiquor number: 0
total liquor number: 395

已有 1 人评分经验 论坛币 收起 理由
李会超 + 40 + 20 精彩帖子

总评分: 经验 + 40  论坛币 + 20   查看全部评分

7
zhou1_20 发表于 2016-1-27 13:12:01
hongweigg 发表于 2016-1-27 13:04
原程序确实有些问题,丢掉了一些未能整换的”零头“,下面进行了修正:

#拥有的酒(以瓶计,不包括瓶盖 ...
咱俩的结果不一样,我的是337

8
cheetahfly 在职认证  发表于 2016-1-27 15:08:51
这里面还有一个可以“借”空瓶和瓶盖的问题,比如我有一个空瓶,我向你借一个空瓶,换成一瓶酒,然后喝完,将多出来的空瓶还给你,自己还留下一个瓶盖。

上面的同学算出395瓶的时候,实际上手上还有一个空瓶和3个瓶盖,这些都是可以通过“借”的方式全部换成酒的。

用联立方程可算出,一个空瓶等于2瓶的“酒本身”,一个瓶盖等于1瓶“酒本身”,所以我算出的答案是400,用excel和R都运行过,以下是R的代码:

  1. beer <- function(x) {
  2.   cumsum <- 0
  3.   beer <- empty.bottle <- cap <- x
  4.   cumsum <- beer
  5.   # you can borrow some empty bottle and cap.
  6.   borrow.bottle <- borrow.cap <- 0
  7.   while(empty.bottle - borrow.bottle > 0 ||
  8.                    cap - borrow.cap > 0) {
  9.     beer <- empty.bottle %/% 2 + cap %/% 4
  10.     empty.bottle <- beer + empty.bottle %% 2
  11.        cap <- beer + cap %% 4
  12.        cumsum <- beer + cumsum
  13.        if (beer == 0 && empty.bottle - borrow.bottle > 0) {
  14.            borrow.bottle <- 1
  15.            empty.bottle <- empty.bottle + borrow.bottle
  16.        } else if (beer == 0 && cap - borrow.cap > 0){
  17.            borrow.cap <- 1 + borrow.cap
  18.            cap <- cap + 1
  19.       }
  20.    }
  21.    cumsum
  22. }
复制代码



已有 1 人评分论坛币 收起 理由
admin_kefu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

9
zhou1_20 发表于 2016-1-27 16:01:47 来自手机
cheetahfly 发表于 2016-1-27 15:08
这里面还有一个可以“借”空瓶和瓶盖的问题,比如我有一个空瓶,我向你借一个空瓶,换成一瓶酒,然后喝完, ...
这个题正确答案是什么?

10
hongweigg 发表于 2016-1-27 17:08:08
cheetahfly 发表于 2016-1-27 15:08
这里面还有一个可以“借”空瓶和瓶盖的问题,比如我有一个空瓶,我向你借一个空瓶,换成一瓶酒,然后喝完, ...
结果确实还剩1个空瓶和3个瓶盖,如果考虑借的话,应该是395+2+1=398瓶酒。
1、借1个空瓶+1个瓶盖,变为2个空瓶和4个瓶盖,刚好可以换2瓶酒,没有空瓶和瓶盖剩下;
2、2瓶酒喝完后还掉1个空瓶1个瓶盖,还剩1个空瓶1个瓶盖;
3、然后再借1个空瓶,换回1瓶酒,还1个空瓶,还剩2个瓶盖;
4、最后剩2个瓶盖,2个瓶盖应该没法再借了,借1个瓶盖不够换,借2个瓶盖还不上。

395计算的详细输出过程见:
http://blog.csdn.net/hongweigg/article/details/50592661
可以很清楚地看到最后剩下的1个空瓶和3个瓶盖。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 18:54