鱼C论坛

 找回密码
 立即注册
查看: 3050|回复: 10

023/024课利用递归判断回字文解答没看懂

[复制链接]
发表于 2016-10-21 21:50:50 | 显示全部楼层 |阅读模式

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

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

x
在023/024中甲鱼老师运用了递归的方法判断一段字符串是不是回字文,我没看懂实现过程
#回字文就是,一句话,按照倒序反着说也成立。比如说“贤出多福地;地福多出贤。”
特征:前一句的字头,为后句的字尾,前句的字尾为后句的字头。


def is_palindrome(n,start,end):                                           -- n,start,end ---三个函数代表啥意思?
        if start > end:                                                                      --1.请问这里start>end,比较的是字符长度,还是其他的?
                                                                                                          2.为什么这里能表达首尾下标碰面?
                return 1                                      
        else:
                return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0    --start和end不是字符串吗?为什么可以加减1,这样做有什么意义?

string = input('请输入一串字符:')
length = len(string) -1                            --没看懂         

if is_palindrome(string,0,length):            --string,0,length 这里是啥意思?
        print('\"%s"是回字文字符串!' %string)

else:
        print('\"%s\"不是回字文字符串!' %string)

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-21 22:22:05 | 显示全部楼层
这里用的是递归的思想。
def is_palindrome(n,start,end):
    if start > end: #这个语句是判断递归是否结束,当start>end时,函数返回 1
        return 1
    else:
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 #这句其实可以这么写:
        if n[start] == n[end]:
            return is_palindrome(n,start+1,end-1)
        else:
            return 0
这样看着是不是更明白?
start和end都不是字符串,都是下标,指明要比较字符串中的首位哪2个字符。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-21 23:15:02 | 显示全部楼层
1.比较的就是数值啊,初始化start=0,end=字符串的长度减一(因为对字符索引从零开始,所以减一)
2.回文数就是收尾一样,所以要判断首尾是不是一样
3.start和end为数值,这里就是通过字符对应的下标,看首尾是不是相等
4.因为对字符索引从零开始,所以减一
5.这是形参和实参的区别,直接传值到定义中去

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-22 04:23:08 | 显示全部楼层
本帖最后由 changhaitian 于 2016-10-22 04:26 编辑
悲伤诉说微笑 发表于 2016-10-21 23:15
1.比较的就是数值啊,初始化start=0,end=字符串的长度减一(因为对字符索引从零开始,所以减一)
2.回文 ...


谢谢你的详细解答,其实这题的关键是下标的意思,我想根据你的解释,下标其实就是列表中数组的长度,这里利用的是回文的两个特征:
1.字符长度相同。
2.字符首尾相符。

我隐约的能明白,但是具体的操作不是太懂。

请问能够结合函数具体讲解一下‘’上海自来水来自海上‘’这句话判断的实现吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-22 04:24:25 | 显示全部楼层
本帖最后由 changhaitian 于 2016-10-22 04:26 编辑
jerryxjr1220 发表于 2016-10-21 22:22
这里用的是递归的思想。
def is_palindrome(n,start,end):
    if start > end: #这个语句是判断递归是否 ...


我隐约的能明白,但是具体的操作不是太懂。

请问能够结合函数具体讲解一下‘’上海自来水来自海上‘’这句话判断的实现吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-22 08:53:02 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-22 08:56 编辑
changhaitian 发表于 2016-10-22 04:24
我隐约的能明白,但是具体的操作不是太懂。

请问能够结合函数具体讲解一下‘’上海自来水来自海上‘ ...


def is_palindrome(n,start,end):
    if start > end: #这个语句是判断递归是否结束,当start>end时,函数返回 1
        return 1
    else:
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 #这句其实可以这么写:
        if n[start] == n[end]:
            return is_palindrome(n,start+1,end-1)
        else:
            return 0
string = input('请输入一串字符:')
length = len(string) -1
if is_palindrome(string,0,length):
    print('\"%s"是回字文字符串!' %string)
else:
    print('\"%s\"不是回字文字符串!' %string)

==========================分==割==线===========================

运行程序:
(1)string = input('请输入一串字符:')
你输入‘’上海自来水来自海上 “
(2)length = len(string) -1  --> length = 9-1 =8
(3)if is_palindrome(string,0,length):  -->调用is_palindrome()函数;string=”上海自来水来自海上 “,length = 8
(4)is_palindrome(n,start,end)函数执行:对应的n=string=”上海自来水来自海上 “,start=0,end=length = 8
(a) if start > end: #这个语句是判断递归是否结束,当start>end时,函数返回 1
        return 1 #第一次显然不成立,执行else后面的语句
    else:
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 #这句其实可以这么写:
(b)if n[start] == n[end]:  --> n[start]="上" == n[end] = '上', 成立,执行下面语句
            return is_palindrome(n,start+1,end-1) -->再次调用is_palindrome()函数;start+1=1,end-1 = 7
(c)is_palindrome(n,start,end)函数执行:对应的n=”上海自来水来自海上 “,start=1,end = 7
(d) if start > end: #这个语句是判断递归是否结束,当start>end时,函数返回 1
        return 1 #第二次显然也不成立,执行else后面的语句
    else:
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 #这句其实可以这么写:
(e)if n[start] == n[end]:  --> n[start]="海" == n[end] = '海', 成立,执行下面语句
            return is_palindrome(n,start+1,end-1) -->再次调用is_palindrome()函数;start+1=2,end-1 = 6
(f)如此循环,直到:
        is_palindrome(n,start,end)函数执行:对应的n=”上海自来水来自海上 “,start=5,end = 3
          if start > end: #这个语句是判断递归是否结束,当start>end时,函数返回 1
            return 1 #成立,返回1
(g)然后因为 return is_palindrome(n,start+1,end-1),把1再次向上层返回,逐层返回1,直到返回递归的第一层,最终函数返回值为1.
(5)if is_palindrome(string,0,length):  --> 因为函数返回值是1,if语句成立,则执行下面语句
            print('\"%s"是回字文字符串!' %string) -->打印 上海自来水来自海上 是回字文字符串!
程序结束。
够详细了吧

评分

参与人数 2荣誉 +8 鱼币 +8 贡献 +6 收起 理由
wadaxisand + 3 + 3 + 3
13572044595 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 5 反对 0

使用道具 举报

 楼主| 发表于 2016-10-23 04:34:23 | 显示全部楼层
jerryxjr1220 发表于 2016-10-22 08:53
def is_palindrome(n,start,end):
    if start > end: #这个语句是判断递归是否结束,当start>end时 ...


太感谢了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 08:38:02 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 10:56:17 | 显示全部楼层
学习了,谢谢,回答的太给力了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-29 21:01:23 | 显示全部楼层
jerryxjr1220 发表于 2016-10-22 08:53
def is_palindrome(n,start,end):
    if start > end: #这个语句是判断递归是否结束,当start>end时 ...

回答的好详细呀!简直就是我们这些零基础小白们的福音!赞赞赞!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-14 15:53:05 | 显示全部楼层
萝御兼修 发表于 2017-12-29 21:01
回答的好详细呀!简直就是我们这些零基础小白们的福音!赞赞赞!

何止是福音,是大大的福音
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-23 11:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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