鱼C论坛

 找回密码
 立即注册
查看: 1659|回复: 19

[已解决]递归实现

[复制链接]
发表于 2022-5-20 15:48:16 | 显示全部楼层 |阅读模式
10鱼币
一元可以买一瓶汽水,两个瓶盖可以换一瓶汽水,问:喝1000瓶汽水最少需要花多少钱?
(差一个瓶盖的时候,不能先赊一瓶汽水,喝完再给老板)需要以递实现
最佳答案
2022-5-20 15:48:17
  1. $ cat main.py
  2. #!/usr/bin/env python
  3. #coding=utf-8

  4. import sys

  5. def func(n):
  6.     if n == 1: return 1
  7.     x = 1 if n % 2 == 0 else 0
  8.     return x + func(n - 1)

  9. sys.setrecursionlimit(1002)
  10. print(func(1000))
  11. $ ./main.py
  12. 501
  13. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 15:48:17 | 显示全部楼层    本楼为最佳答案   
  1. $ cat main.py
  2. #!/usr/bin/env python
  3. #coding=utf-8

  4. import sys

  5. def func(n):
  6.     if n == 1: return 1
  7.     x = 1 if n % 2 == 0 else 0
  8.     return x + func(n - 1)

  9. sys.setrecursionlimit(1002)
  10. print(func(1000))
  11. $ ./main.py
  12. 501
  13. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 16:13:59 | 显示全部楼层
504 对不对啊

  1. t=0
  2. def fun(n):
  3.     global t
  4.     if n<1:
  5.        return t
  6.     t+=n
  7.     return fun(n//2)        

  8. for x in range(500,1000):
  9.     t=0
  10.     s=fun(x)  
  11.     t=0
  12.     s1=fun(x+1)
  13.     if s<1000 and s1>=1000:
  14.       print(x+1)
  15.       break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 16:20:37 | 显示全部楼层
我用循环实现的是 501
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 16:23:47 | 显示全部楼层
本帖最后由 wp231957 于 2022-5-20 16:26 编辑


501对的  我的算法有问题  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 16:30:04 | 显示全部楼层
wp231957 发表于 2022-5-20 16:23
501对的  我的算法有问题

501,125,31,15,7,3 换的时候都能留下一个瓶盖,可以再换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 16:47:27 | 显示全部楼层
来自星星的小明 发表于 2022-5-20 16:30
501,125,31,15,7,3 换的时候都能留下一个瓶盖,可以再换
  1. t=0
  2. def fun(n):
  3.     global t
  4.     if n<=1:
  5.        return t
  6.     t+=n
  7.     if (n+n%2)%2==0 and n%2:
  8.         t-=1
  9.     return fun((n+n%2)//2)        

  10. for x in range(500,520):
  11.     t=0
  12.     s=fun(x)  
  13.     t=0
  14.     s1=fun(x+1)
  15.     if s<1000 and s1>=1000:
  16.       print(x+1)
  17.       break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 16:54:44 | 显示全部楼层

还是不对,算519时  和手工计算不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:19:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:19:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:24:32 | 显示全部楼层
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 17:40:04 | 显示全部楼层

有点看不明白啊,能帮我解释一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:44:12 | 显示全部楼层
来自星星的小明 发表于 2022-5-20 17:40
有点看不明白啊,能帮我解释一下吗

第1瓶和第2瓶花钱,第3瓶免费,用的第1瓶和第2瓶的瓶盖
第4瓶花钱,第5瓶免费,用的第3瓶和第4瓶的瓶盖
6花钱,7免费,8花钱,9免费,。。。
单数免费,双数花钱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 17:50:33 | 显示全部楼层
人造人 发表于 2022-5-20 17:44
第1瓶和第2瓶花钱,第3瓶免费,用的第1瓶和第2瓶的瓶盖
第4瓶花钱,第5瓶免费,用的第3瓶和第4瓶的瓶盖
...

收下我的膝盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 17:52:07 | 显示全部楼层
人造人 发表于 2022-5-20 17:44
第1瓶和第2瓶花钱,第3瓶免费,用的第1瓶和第2瓶的瓶盖
第4瓶花钱,第5瓶免费,用的第3瓶和第4瓶的瓶盖
...

我想问一下,但是我感觉要是说  3瓶换一瓶    4瓶换一瓶  5瓶换一瓶   ,他这个 好改嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:54:08 | 显示全部楼层
  1. $ cat main.py
  2. #!/usr/bin/env python
  3. #coding=utf-8

  4. import sys

  5. def func(n):
  6.     x = 1 if n % 2 == 0  or n == 1 else 0
  7.     print(f"第{n}瓶花费{x}元")
  8.     if n == 1: return 1
  9.     x = 1 if n % 2 == 0 else 0
  10.     return x + func(n - 1)

  11. sys.setrecursionlimit(1004)
  12. #print(func(1000))

  13. for i in range(1, 9):
  14.     print(f"i = {i}")
  15.     print(func(i))
  16.     print('')
  17. $ ./main.py
  18. i = 1
  19. 第1瓶花费1元
  20. 1

  21. i = 2
  22. 第2瓶花费1元
  23. 第1瓶花费1元
  24. 2

  25. i = 3
  26. 第3瓶花费0元
  27. 第2瓶花费1元
  28. 第1瓶花费1元
  29. 2

  30. i = 4
  31. 第4瓶花费1元
  32. 第3瓶花费0元
  33. 第2瓶花费1元
  34. 第1瓶花费1元
  35. 3

  36. i = 5
  37. 第5瓶花费0元
  38. 第4瓶花费1元
  39. 第3瓶花费0元
  40. 第2瓶花费1元
  41. 第1瓶花费1元
  42. 3

  43. i = 6
  44. 第6瓶花费1元
  45. 第5瓶花费0元
  46. 第4瓶花费1元
  47. 第3瓶花费0元
  48. 第2瓶花费1元
  49. 第1瓶花费1元
  50. 4

  51. i = 7
  52. 第7瓶花费0元
  53. 第6瓶花费1元
  54. 第5瓶花费0元
  55. 第4瓶花费1元
  56. 第3瓶花费0元
  57. 第2瓶花费1元
  58. 第1瓶花费1元
  59. 4

  60. i = 8
  61. 第8瓶花费1元
  62. 第7瓶花费0元
  63. 第6瓶花费1元
  64. 第5瓶花费0元
  65. 第4瓶花费1元
  66. 第3瓶花费0元
  67. 第2瓶花费1元
  68. 第1瓶花费1元
  69. 5

  70. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 17:57:14 | 显示全部楼层
来自星星的小明 发表于 2022-5-20 17:52
我想问一下,但是我感觉要是说  3瓶换一瓶    4瓶换一瓶  5瓶换一瓶   ,他这个 好改嘛

我研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 18:01:43 | 显示全部楼层
  1. def exchange(m):
  2.     num = m
  3.     while m // 2:
  4.         num += m // 2
  5.         m = m % 2 + m // 2
  6.     return num

  7. for money in range(1000):
  8.     if exchange(money) >= 1000:
  9.         print("%d 块钱喝 %d 瓶" %(money,exchange(money)))
  10.         break
复制代码


这个是我写的循环,能不能以这个思路写递归呢,我研究了半天都写不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 18:21:59 | 显示全部楼层
  1. #!/usr/bin/env python
  2. #coding=utf-8

  3. import sys

  4. # 3_1
  5. def free(n):
  6.     return True if n != 1 and (n - 1) % 3 == 0 else False

  7. def free_4_1(n):
  8.     return True if n != 1 and (n - 1) % 4 == 0 else False

  9. def free_5_1(n):
  10.     return True if n != 1 and (n - 1) % 5 == 0 else False

  11. def func(n, free_func):
  12.     x = 0 if free_func(n) else 1
  13.     print(f"第{n}瓶花费{x}元")
  14.     if n == 1: return 1
  15.     x = 0 if free_func(n) else 1
  16.     return x + func(n - 1, free_func)

  17. sys.setrecursionlimit(1004)
  18. #print(func(1000))

  19. print("3_1")
  20. for i in range(1, 20):
  21.     print(f"i = {i}")
  22.     print(func(i, free))
  23.     print('')

  24. print("4_1")
  25. for i in range(1, 20):
  26.     print(f"i = {i}")
  27.     print(func(i, free_4_1))
  28.     print('')

  29. print("5_1")
  30. for i in range(1, 20):
  31.     print(f"i = {i}")
  32.     print(func(i, free_5_1))
  33.     print('')
复制代码


1.jpg
2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 18:30:00 | 显示全部楼层
来自星星的小明 发表于 2022-5-20 18:01
这个是我写的循环,能不能以这个思路写递归呢,我研究了半天都写不出来

不能,递归和迭代的思路是不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-31 02:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表