鱼C论坛

 找回密码
 立即注册
查看: 1618|回复: 5

[已解决]回文字符串递归解法表达式怎么理解?

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

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

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

x
def is_palindrome(n,start,end):
    if start > end:
        return 1
    else:
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0

string = input("请输入一串字符串:")  #这里我输入:addddda
length = len(string)-1

if is_palindrome(string,0,length): #这里面的实参是什么意思?跟形参start end之间是什么关系?
    print('"%s"是回文字符串!' % string)
else:
    print('"%s"不是回文字符串!' % string)

return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 这句该怎样理解,当n[start] == n[end]不成立时,,下面的步骤应该是怎样的,最好一步一步写,,求解::多谢多谢!!
最佳答案
2020-11-21 12:01:52
本帖最后由 Twilight6 于 2020-11-21 12:03 编辑



看下下面这些递归大致步骤,你前面太长了,但是大体上就这里后续的样算都是这样:

假设你输入是 ada , 此时 length 就为 2 ,然后调用函数 is_palindrome(string,0,length) 则:

is_palindrome('ada',0,2) --> if start(0) > end(2) --> False --> else --> return is_palindrome('ada',0+1,2-1) if n[0] == n[2] else 0 --> return is_palindrome('ada',0+1,2-1)

第一次进入递归:

is_palindrome('ada',1,1) --> if start(1) > end(1) --> False --> else --> return is_palindrome('ada',1+1,1-1) if n[1] == n[1] else 0 --> return is_palindrome('ada',2,0)

第二次进入递归:

is_palindrome('ada',2,0) --> if start(2) > end(0) --> True  --> return 1

最终返回 1 ,这里 return 用了三元运算符,即 <结果> if <条件> else <结果> , if 条件成立,则执行 if 前面的结果,反之执行 else 后面的结果


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

使用道具 举报

发表于 2020-11-20 21:55:27 | 显示全部楼层
这么短的程序,自己拿着笔顺着走一遍不就出结果了么。。。若这个都搞不定,那么今后如何去看上万行的代码。。。
形参和实参不理解,这到还算是个问题
打个比方,有一张表(就是函数),表中需要填写信息(信息名称实际上就是形参),需要的信息有姓名、性别、年龄(就好比这里的n、start、end)。小明填写了他的信息:小明、男、15岁(这就是实参,相当于string,0,length-1)

这次帮你写一下注释,今后更多还是要靠自己,那样学到的才扎实
def is_palindrome(n,start,end):#3、第一次调用,is_palindrome('addddda',0,6)
    if start > end:#4、判断0>6,为假,去执行else
        return 1
    else:/5、执行下面这句
        return is_palindrome(n,start+1,end-1) if n[start] == n[end] else 0 #6、先判断n[0]==n[6],若为真,返回is_palindrome('addddda',1,5)的值,若为假返回0,显然为真,那么递归调用is_palindrome('addddda',1,5),再去执行3
string = input("请输入一串字符串:")  #这里我输入:addddda
length = len(string)-1 #1、length=7-1=6

if is_palindrome(string,0,length): #2、函数的返回值作为if的条件,所以先去执行函数,is_palindrome('addddda',0,6)
    print('"%s"是回文字符串!' % string)
else:
    print('"%s"不是回文字符串!' % string)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 08:52:24 From FishC Mobile | 显示全部楼层
你要问幼儿园小朋友,一元二次方程都不会,,小朋友怎么回答你,就是因为不懂才问的,,你要是不想回复,,不理我问的问题就行了呗,何必这样说。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 08:56:24 From FishC Mobile | 显示全部楼层
还有代码我是拷贝别人的,形参和实参我理解,忘了删除这一行问题
#这里面的实参是什么意思?跟形参start end之间是什么关系?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 12:01:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-11-21 12:03 编辑



看下下面这些递归大致步骤,你前面太长了,但是大体上就这里后续的样算都是这样:

假设你输入是 ada , 此时 length 就为 2 ,然后调用函数 is_palindrome(string,0,length) 则:

is_palindrome('ada',0,2) --> if start(0) > end(2) --> False --> else --> return is_palindrome('ada',0+1,2-1) if n[0] == n[2] else 0 --> return is_palindrome('ada',0+1,2-1)

第一次进入递归:

is_palindrome('ada',1,1) --> if start(1) > end(1) --> False --> else --> return is_palindrome('ada',1+1,1-1) if n[1] == n[1] else 0 --> return is_palindrome('ada',2,0)

第二次进入递归:

is_palindrome('ada',2,0) --> if start(2) > end(0) --> True  --> return 1

最终返回 1 ,这里 return 用了三元运算符,即 <结果> if <条件> else <结果> , if 条件成立,则执行 if 前面的结果,反之执行 else 后面的结果


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

使用道具 举报

 楼主| 发表于 2020-11-21 19:36:37 | 显示全部楼层
Twilight6 发表于 2020-11-21 12:01
看下下面这些递归大致步骤,你前面太长了,但是大体上就这里后续的样算都是这样:

假设你输入是 ada ...

大神就是大神。。。多谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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