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
,它可以满足您的需要。但是,由于您对自己递归地实现这样一个函数感兴趣,您只需考虑以下几点:
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