李白沽酒问题无法使用def进行解决

问题遇到的现象和发生背景

李白沽酒问题

问题相关代码,请勿粘贴截图
def jiajiu(jiuliang):
    jiuliang=(jiuliang+6)/2
    print(jiuliang)

a=0
i=0
while i<4:
    jiajiu(a)
    i+=1
print(a)

运行结果及报错内容

3.0
3.0
3.0
3.0
0

进程已结束,退出代码0

李白沽酒:
李白,提着酒壶去沽酒。他每遇到一个店,就把壶中的酒加上一倍,每见到一次花,来了诗兴,就要喝一斗酒。就这样,三次遇上店和花,壶中的酒便喝光了。

emmm,你这个和李白沽酒有啥关系啊

jiuliang是形参,你改它有什么用
你需要把形参作为返回值返回
或者函数里使用全局变量
再或者不要使用不可变值类型,而使用list之类的可变值类型

??有什么问题 输出四个3 跟一个0 没有问题啊

首先原因前面的已经说了,你在函数内部修改不可变变量是不可以的,建议自己学习一下函数的作用域相关知识
如果一定要用函数解决可以参考这个写法

left = 0

def step():
    global left
    left += 1
    left /=2


for i in range(3):
    step()

print(left)
print(7/8)

不知道题主的李白沽酒原题是怎样的,如果是"李白提壶去买酒,遇店加一倍,见花喝一斗;三遇店和花,喝光壶中酒", 则下面是一个实现,供参考:
把喝酒的过程中逆推就可以了,首先是最后喝光了酒,所以酒a为0,然后用for循环循环三次,逆推喝酒过程:遇花喝一斗,即原来的酒为a+=1, 遇店加一倍,即原来的酒为a/=2,如此循环三次,即逆推出原来有多少酒。
参考链接:
Java编程解决“李白沽酒”问题_公众号-老炮说Java的博客-CSDN博客

#def jiajiu(jiuliang):
  #  jiuliang=jiuliang/2
    #print(jiuliang)

 
a=0 #喝完剩下的酒
i=0
while i<3:
    #因为是逆推,所以先从遇花喝酒开始,然后是遇店加酒
    a+=1  #逆推遇花喝一斗之前是多少酒
    #jiajiu(a)  
    a/=2  #逆推遇店加一倍之前是多少酒
    print(a)
    i+=1 
#打印原来的酒    
print(a)
 



img

如果是“李白沽酒探亲朋,路途迢迢有四程,行至一程多一倍,却被书童喝六升,行到亲朋家里面,半点全无在酒瓶”,,则下面是他的一个实现, 供参考:
李白沽酒探亲朋,路途迢迢有四程,行至一程多一倍,却被书童喝六升,行到亲朋家里面,半点全无在酒瓶,_百度知道

#def jiajiu(jiuliang):
    #jiuliang=jiuliang/2
    #print(jiuliang)

 
a=0 #
i=0
while i<4:
   
    a+=6  
    #jiajiu(a)  
    a/=2  
    print(a)
    i+=1 
  
print(a)
 


img