鱼C论坛

 找回密码
 立即注册
查看: 1538|回复: 6

[已解决]回文联求解答

[复制链接]
发表于 2020-11-17 14:36:25 | 显示全部楼层 |阅读模式

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

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

x
程序如下:
def huiwenlian(list1):
    length = len(list1)
    if length%2 != 0:
        for each in range(length-1):
            if list1(each) == list1(length-1-each):
                print("回文联")
            else:
                print("不是回文联")
    else:
        for each in range(length-1):
            if list1(each) == list1(length-1-each) and each != length/2:
                print("回文联")
            else:
                print("不是回文联")
list1 = input("input a sentence: ")
print(huiwenlian(list1))

运行之后报错如下:
Traceback (most recent call last):
  File "F:/Programming/Python/practice/20.0回文联.py", line 16, in <module>
    print(huiwenlian(list1))
  File "F:/Programming/Python/practice/20.0回文联.py", line 5, in huiwenlian
    if list1(each) == list1(length-1-each):
TypeError: 'str' object is not callable

请问大佬哪里出了问题?该怎么改?
最佳答案
2020-11-17 16:45:25
本帖最后由 逃兵 于 2020-11-17 16:49 编辑

首先说明你的代码错误,列表切片是使用中括号[]而非小括号
另外打印函数的话会出现None因为函数没有返回值,所以只需要调用函数就可以,不需要打印

先写个偷懒版
  1. def huiwenlian(list1):
  2.     if list1 == list1[::-1]:
  3.         print('回文联')
  4.     else:
  5.         print('不是回文联')
  6. list1 = input("input a sentence: ")

  7. huiwenlian(list1)
复制代码




根据你的逻辑分析
1.先判断列表个数是奇数还是偶数
2.再判断第一个字是否和最后一个字相同,第二个字和倒数第二个字是否相同以此类推
3.如果都相同,那么它是回文联

在这里我们修改一下逻辑
去掉第1条,不需要判断奇数偶数
保留第2条,判断第一个字是否和最后一个字相同,第二个字和倒数第二个字是否相同以此类推
修改第3条,如果出现任意一次不相同时,不是回文联,否则为回文联

修改后的代码:
  1. def huiwenlian(list1):
  2.     a = 0
  3.     length = len(list1)
  4.     for each in range(length-1):
  5.         if list1[each] != list1[length-1-each]:
  6.             a=1
  7.             break
  8.     if a == 0:
  9.         print('是回文联')
  10.     else:
  11.         print('不是回文联')

  12. list1 = input("input a sentence: ")
  13. huiwenlian(list1)
复制代码

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

使用道具 举报

发表于 2020-11-17 14:52:09 | 显示全部楼层
本帖最后由 heidern0612 于 2020-11-17 14:57 编辑

1、你的程序逻辑有问题,把自己逻辑思路理清楚再说。

按照你的逻辑,for循环只判断了一次,就打印了是回文联,这显示是不正确的。


2、题中错误在list1的下标应该是中括号[],不是小括号(),把你的list1后面的小括号都改成中括号试试。


3、假如不想用下标负数的情况(这种是最简单判断回文联的方法),想麻烦或者做的更有趣一点。

可以考虑先len字符串长度,然后算出最大判断值。如字符串长度为5,只需要判断两次是否相符。

初始化一个计数变量,然后用for循环判断,符合就+1,不符合就continue就好。

只要计数变量等于你判断的次数,便是回文联,否则就不是。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 16:45:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 逃兵 于 2020-11-17 16:49 编辑

首先说明你的代码错误,列表切片是使用中括号[]而非小括号
另外打印函数的话会出现None因为函数没有返回值,所以只需要调用函数就可以,不需要打印

先写个偷懒版
  1. def huiwenlian(list1):
  2.     if list1 == list1[::-1]:
  3.         print('回文联')
  4.     else:
  5.         print('不是回文联')
  6. list1 = input("input a sentence: ")

  7. huiwenlian(list1)
复制代码




根据你的逻辑分析
1.先判断列表个数是奇数还是偶数
2.再判断第一个字是否和最后一个字相同,第二个字和倒数第二个字是否相同以此类推
3.如果都相同,那么它是回文联

在这里我们修改一下逻辑
去掉第1条,不需要判断奇数偶数
保留第2条,判断第一个字是否和最后一个字相同,第二个字和倒数第二个字是否相同以此类推
修改第3条,如果出现任意一次不相同时,不是回文联,否则为回文联

修改后的代码:
  1. def huiwenlian(list1):
  2.     a = 0
  3.     length = len(list1)
  4.     for each in range(length-1):
  5.         if list1[each] != list1[length-1-each]:
  6.             a=1
  7.             break
  8.     if a == 0:
  9.         print('是回文联')
  10.     else:
  11.         print('不是回文联')

  12. list1 = input("input a sentence: ")
  13. huiwenlian(list1)
复制代码

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

使用道具 举报

 楼主| 发表于 2020-11-18 08:41:39 | 显示全部楼层
逃兵 发表于 2020-11-17 16:45
首先说明你的代码错误,列表切片是使用中括号[]而非小括号
另外打印函数的话会出现None因为函数没有返回值 ...

卧槽,大佬牛逼,你写的第二个我是真佩服!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 08:58:49 | 显示全部楼层
CarterZhang 发表于 2020-11-18 08:41
卧槽,大佬牛逼,你写的第二个我是真佩服!

给个最佳呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-18 09:00:30 | 显示全部楼层
heidern0612 发表于 2020-11-17 14:52
1、你的程序逻辑有问题,把自己逻辑思路理清楚再说。

按照你的逻辑,for循环只判断了一次,就打印了是回 ...

感谢大佬!按照大佬第三点说的方法,我写出来啦!非常感谢!请大佬过目!
def huiwenlian(list1):
    length_1 = len(list1)
    length = length_1//2
    a = 0
    for each in range(length):
        if list1[each] == list1[length_1-1-each]:
            a += 1
        else:
            continue
    if a == length:
        print("回文联")
    else:
        print("不是回文联")

list1 = input("请输入一句话:")
huiwenlian(list1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 09:12:14 | 显示全部楼层
CarterZhang 发表于 2020-11-18 09:00
感谢大佬!按照大佬第三点说的方法,我写出来啦!非常感谢!请大佬过目!
def huiwenlian(list1):
     ...

计算相同的次数,验证相同的次数是否等于length
没有错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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