Recursion 带String.substring的SML递归编程

Recursion 带String.substring的SML递归编程,recursion,sml,Recursion,Sml,我正在尝试编写一个程序,它将两个字符串s1和s2作为参数。函数应检查s2是否包含s1,如果包含,程序应在s2中写入s1的第一个字母所在的位置 我想检查:String.substring(s2,大小s2-大小s1,大小s1)=s1。 然后我需要对(大小s2-1)进行递归,这样s2在每次比较后都会变小一个,从而将s2的s1比较向左移动一个字母 我对递归没有任何问题,比如: fun recurison 0 = 0 | recurison n = n + (n - 1) 但是,当我与其他函数或St

我正在尝试编写一个程序,它将两个字符串
s1
s2
作为参数。函数应检查
s2
是否包含
s1
,如果包含,程序应在
s2
中写入
s1
的第一个字母所在的位置

我想检查:
String.substring(s2,大小s2-大小s1,大小s1)=s1
。 然后我需要对
(大小s2-1)
进行递归,这样
s2
在每次比较后都会变小一个,从而将
s2
s1
比较向左移动一个字母

我对递归没有任何问题,比如:

fun recurison 0 = 0
  | recurison n = n + (n - 1)

但是,当我与其他函数或
String.substring
交互时,感觉很混乱。当我试图写一些递归的东西时,我应该怎么想?你能就这个问题给我一个提示吗?我喜欢自己提出解决方案,但需要帮助指出正确的道路。

首先,已经有了函数
String.isSubstring:String->String->bool
,它可以满足您的需要。但是,由于您对自己递归地实现这样一个函数感兴趣,您只需考虑以下几点:

  • 基本情况是什么(即递归何时结束)
  • 步骤是什么(即,如何从较小的解决方案中获得解决方案)
  • 因为在您的描述中,您开始从右侧检查子字符串,然后向左移动,所以基本情况是当您到达最左侧位置(即0)时。对于步骤情况,在您检查位置
    i
    之后,您必须检查位置
    i-1

    首先,您可以使用一个函数来处理检查位置
    i
    的情况

    fun substringat s1 s2 i =
      if size s1 + i > size s2 then false
      else String.substring (s2, i, size s1) = s1;
    
    然后是递归的框架

    fun substringfrom s1 s2 i =
      if i < 0 then ~1
      else if substringat s1 s2 i then i
      else substringfrom s1 s2 (i - 1);
    
    为了避免一些不必要的检查,我们可以将所有这些合并到

     fun substring s1 s2 =
       let
         val l1 = size s1;
         val l2 = size s2;
    
         fun substringat s1 s2 i =
           if l1 + i > l2 then false
           else String.substring (s2, i, l1) = s1;
    
         fun substringfrom s1 s2 i =
           if i < 0 then ~1
           else if substringat s1 s2 i then i
           else substringfrom s1 s2 (i - 1);
       in
         substringfrom s1 s2 (l2 - 1)
       end
    
    fun子串s1 s2=
    让
    val l1=尺寸s1;
    val l2=尺寸s2;
    s1 s2 i的乐趣=
    如果l1+i>l2,则为false
    else String.substring(s2,i,l1)=s1;
    从s1到s2的有趣子串i=
    如果i<0,则~1
    否则,如果子字符串位于s1 s2 i,则i
    s1-s2(i-1)的else子串;
    在里面
    从s1到s2(l2-1)的子字符串
    结束
    
     fun substring s1 s2 =
       let
         val l1 = size s1;
         val l2 = size s2;
    
         fun substringat s1 s2 i =
           if l1 + i > l2 then false
           else String.substring (s2, i, l1) = s1;
    
         fun substringfrom s1 s2 i =
           if i < 0 then ~1
           else if substringat s1 s2 i then i
           else substringfrom s1 s2 (i - 1);
       in
         substringfrom s1 s2 (l2 - 1)
       end