鱼C论坛

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

[已解决]递归实现

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

import sys

def func(n):
    if n == 1: return 1
    x = 1 if n % 2 == 0 else 0
    return x + func(n - 1)

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

使用道具 举报

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

import sys

def func(n):
    if n == 1: return 1
    x = 1 if n % 2 == 0 else 0
    return x + func(n - 1)

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

使用道具 举报

发表于 2022-5-20 16:13:59 | 显示全部楼层
504 对不对啊
t=0
def fun(n):
    global t
    if n<1:
       return t
    t+=n
    return fun(n//2)        

for x in range(500,1000):
    t=0
    s=fun(x)  
    t=0
    s1=fun(x+1)
    if s<1000 and s1>=1000:
      print(x+1)
      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 换的时候都能留下一个瓶盖,可以再换
t=0
def fun(n):
    global t
    if n<=1:
       return t
    t+=n
    if (n+n%2)%2==0 and n%2:
        t-=1
    return fun((n+n%2)//2)        

for x in range(500,520):
    t=0
    s=fun(x)  
    t=0
    s1=fun(x+1)
    if s<1000 and s1>=1000:
      print(x+1)
      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 | 显示全部楼层
$ cat main.py
#!/usr/bin/env python
#coding=utf-8

import sys

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

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

for i in range(1, 9):
    print(f"i = {i}")
    print(func(i))
    print('')
$ ./main.py
i = 1
第1瓶花费1元
1

i = 2
第2瓶花费1元
第1瓶花费1元
2

i = 3
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
2

i = 4
第4瓶花费1元
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
3

i = 5
第5瓶花费0元
第4瓶花费1元
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
3

i = 6
第6瓶花费1元
第5瓶花费0元
第4瓶花费1元
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
4

i = 7
第7瓶花费0元
第6瓶花费1元
第5瓶花费0元
第4瓶花费1元
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
4

i = 8
第8瓶花费1元
第7瓶花费0元
第6瓶花费1元
第5瓶花费0元
第4瓶花费1元
第3瓶花费0元
第2瓶花费1元
第1瓶花费1元
5

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

使用道具 举报

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

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

使用道具 举报

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

for money in range(1000):
    if exchange(money) >= 1000:
        print("%d 块钱喝 %d 瓶" %(money,exchange(money)))
        break

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

使用道具 举报

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

import sys

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

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

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

def func(n, free_func):
    x = 0 if free_func(n) else 1
    print(f"第{n}瓶花费{x}元")
    if n == 1: return 1
    x = 0 if free_func(n) else 1
    return x + func(n - 1, free_func)

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

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

print("4_1")
for i in range(1, 20):
    print(f"i = {i}")
    print(func(i, free_4_1))
    print('')

print("5_1")
for i in range(1, 20):
    print(f"i = {i}")
    print(func(i, free_5_1))
    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-11-18 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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