鱼C论坛

 找回密码
 立即注册
查看: 2336|回复: 9

[已解决]纯新手,问题第二弹!!!求大神帮助!

[复制链接]
发表于 2021-1-15 14:49:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1

    if flag == 1:
        return 1
    else:
        return 0

string = input('请输入一句话:')
if palindrome(string) == 1:
    print('是回文联!')
else:
    print('不是回文联!')


这段程序中,删掉 length // =2 并不影响程序运行,所以放在这的目的具体是啥,定位到字符串的中间位置有什么意义么, 比如“上海自来水来自海上”, 按照程序中的运行来说,length 先被赋值了9, 但在运行到length//=2的时候,赋值不是发生变化成为了4么? 那么在后面 for each in range(length)这段代码中,length的值是4的话,比较的字符串是不是变成“上海自来”——————————(以上都是我按照自身逻辑理解的这段代码,我知道一定是我自己逻辑哪出问题了,所以希望大神指出是哪个基础逻辑点跑偏导致我会这样理解),感谢!!!
最佳答案
2021-1-15 14:58:44
本帖最后由 昨非 于 2021-1-15 15:02 编辑

还是这个注释内容
def palindrome(string): #定义函数,传入参数(字符串)
    length = len(string)
    last = length-1   #求的长度减一作为其索引值
    length //= 2    #索引值地板除2,得到中间字符的索引,以方便从两头依次按位比较
    flag = 1        #是否是回文联的标实符
    for each in range(length): #each从0开始取到整个字符串的中间位置  
        if string[each] != string[last]:  #如果头不等于尾,(直接排除)
            flag = 0#(直接淘汰的情况下,标实符变成0)
        last -= 1  #last变小,说明尾部前移,下次循环中each增大,说明头部后移,一直到each=last(全部字符串的中间位置),索命找完了

    if flag == 1:  #标实符没变,说明是回文联
        return 1
    else:           #相反
        return 0


假设有7个字符
7地板除2得到3,所以3就是判断的中止条件(也就是楼上那位老师说的循环次数)
(下面的数字都是索引值,从1到6)
0和6比较,1和5比较,2和4比较,到3停止

去掉地板除 之后,岂不是要
让4和2比较,5和1比较,6和0比较
是不是比较了两遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-15 14:54:48 | 显示全部楼层
怎么会?
不能删的,
length//=2得到的是字符串的中间位置
删掉之后,从头比较到尾,那不是比较了两遍吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 14:56:42 | 显示全部楼层
      其目的并不是定位到字符串中部,而是用于控制循环次数,因为每次循环都比较字符串中的 2 个字符,所以,总共需要循环 len(string) // 2 次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 14:58:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 昨非 于 2021-1-15 15:02 编辑

还是这个注释内容
def palindrome(string): #定义函数,传入参数(字符串)
    length = len(string)
    last = length-1   #求的长度减一作为其索引值
    length //= 2    #索引值地板除2,得到中间字符的索引,以方便从两头依次按位比较
    flag = 1        #是否是回文联的标实符
    for each in range(length): #each从0开始取到整个字符串的中间位置  
        if string[each] != string[last]:  #如果头不等于尾,(直接排除)
            flag = 0#(直接淘汰的情况下,标实符变成0)
        last -= 1  #last变小,说明尾部前移,下次循环中each增大,说明头部后移,一直到each=last(全部字符串的中间位置),索命找完了

    if flag == 1:  #标实符没变,说明是回文联
        return 1
    else:           #相反
        return 0


假设有7个字符
7地板除2得到3,所以3就是判断的中止条件(也就是楼上那位老师说的循环次数)
(下面的数字都是索引值,从1到6)
0和6比较,1和5比较,2和4比较,到3停止

去掉地板除 之后,岂不是要
让4和2比较,5和1比较,6和0比较
是不是比较了两遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 15:02:09 | 显示全部楼层
那么length//=2这段代码不会导致后边for each in range(length)中的length的值发生变化么?本来是7,运行完length//=2的时候不是变成了3么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 15:02:40 | 显示全部楼层
昨非 发表于 2021-1-15 14:58
还是这个注释内容


那么length//=2这段代码不会导致后边for each in range(length)中的length的值发生变化么?本来是7,运行完length//=2的时候不是变成了3么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 15:04:38 | 显示全部楼层
frankhu 发表于 2021-1-15 15:02
那么length//=2这段代码不会导致后边for each in range(length)中的length的值发生变化么?本来是7,运 ...

会变化,因为each只是从前往后走的那个字符的索引值
从后往前比较的那个索引值由last控制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 15:08:32 | 显示全部楼层
昨非 发表于 2021-1-15 15:04
会变化,因为each只是从前往后走的那个字符的索引值
从后往前比较的那个索引值由last控制

懂了,恍然大悟。。。 我把last也算到range(length)l里了。。。 真心低级错误。。。。 一语点醒,所以length//=2 本质上说是提高运行效率减掉无效操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 15:12:25 | 显示全部楼层
frankhu 发表于 2021-1-15 15:08
懂了,恍然大悟。。。 我把last也算到range(length)l里了。。。 真心低级错误。。。。 一语点醒,所以len ...

for循环的each控制的索引只从开头到中间位置
相应的last控制的索引从最后到中间位置
一对一对的比较是否相同,最终判断出是否为回文串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 15:17:24 | 显示全部楼层
昨非 发表于 2021-1-15 15:12
for循环的each控制的索引只从开头到中间位置
相应的last控制的索引从最后到中间位置
一对一对的比较是 ...

嗯嗯,一开始逻辑基点错在我把last的索引也和length的变化关联了。。。然后发现last的索引是在length//=2前的。 所以last中的length值是不变的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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