Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归函数以查找string2的字符串1子字符串_Python_Python 2.7_Function_Recursive Query - Fatal编程技术网

Python 递归函数以查找string2的字符串1子字符串

Python 递归函数以查找string2的字符串1子字符串,python,python-2.7,function,recursive-query,Python,Python 2.7,Function,Recursive Query,我试图找到一个递归函数,如果string1是string2的子字符串,则返回true;否则,通过递归检查str2是否以str1开头,则返回false 我尝试这个代码,但它不工作,我不知道为什么 def main(): s1 = input("enter string") s2 = input("enter steing") sub = subs(s1,s2) print(sub) def subs(s1, s2): if s2 == 0:

我试图找到一个递归函数,如果string1是string2的子字符串,则返回true;否则,通过递归检查str2是否以str1开头,则返回false

我尝试这个代码,但它不工作,我不知道为什么

def main():
   s1 = input("enter string")
   s2 = input("enter steing")
   sub = subs(s1,s2)
   print(sub)

   def subs(s1, s2):
       if s2 == 0:
          return True
       else:
           if s2.startswith((s1)):
              subs(s1, s2[1:])
            return True 
   main()

谢谢大家!

您的程序首先有几个语法问题:

  • 在实际定义函数之前,您正在调用
    subs
    函数
  • main()的缩进已关闭
  • subs
    main
    的一个内部函数。虽然在技术上并不错误,但使用内部函数会使代码更难阅读
  • 您还存在一些语义问题:

  • subs
    仅在转义条件下返回true,没有默认返回值。这是拙劣的做法
  • subs
    正在检查
    s2==0
    ,它永远不会是-strings不等于0。空字符串是错误的,因此您可以使用
    if not s2:
    检查字符串是否为空
  • 您的逻辑规定,只有当
    s2
    s1
    开头时,才会发生递归,这意味着如果s1='ab'和s2='habc',即使s1是s2的子字符串,也不会触发递归

  • 我的建议是重新检查你的算法。首先确定如何开始寻找候选子字符串,然后确定转义条件,然后确定如何将问题分解为较小的问题。

    我重写了您编写的代码,但直觉保持不变。主要问题是:

    1.许多地方的缩进错误

    2.调用后的函数定义

    3.查找空字符串的方法错误

    def main():
    
        def subs(s1, s2,k):
            #If input string is empty .
            if k==0 and not s2.strip():
                print("Yes")
                return 0
            #String 1 not empty and search for the sub-string.
            elif s1.strip() and s1.startswith(s2):
                print("Yes")
                return 0
            #String 1 not empty and sub-string not matched.
            elif s1.strip():
                subs(s1[1:],s2,1)
            #String empty and sub-string not match.
            else :
                print("No")
    
    
    
        s1 = input("enter string")
        s2 = input("enter sub-string")
        sub = subs(s1,s2,0)
        #print(sub)
    
    
    
    main()
    

    您没有返回递归调用的结果。也许还有其他的问题,但这正是我突然想到的。他的回答没有任何地方是错误的;谢谢你,我会尽力去做的。。关于第三点,你能帮我写代码吗?因为我试过很多次了,但都不管用,所以你有一个好主意,只是还没有充实出来。如果s2或s1为空,那么我们应该绝对返回false,对吗?因为你不能有一个空的子串。如果这不是真的,那么如果s2从s1开始,那么我们有一个子字符串,我们应该返回真。但是,如果不是(这是您错过的),那么我们应该返回递归函数subs的值,并切掉s2的第一个字母。这种逻辑有意义吗?你能把它翻译成代码吗?def subs(s1,s2):if s1或s2==“”:return False else:for i in range(len(s2)):if s2.startswith((s1)):return True else:return(subs(s1,s2[i:])我这样写,但每次都会导致Falsetime@haymk不幸的是,代码格式在注释中不起作用,来吧,我可以帮你。