我正在尝试做一个练习,您必须定义一个递归函数,该函数能够使用另一个指示 Char 是否为元音的函数返回带有字符串的所有元音的字符串:
object ej8 {
def esVocal(letra:Char):Boolean={
var vocal:Boolean=false
if(letra=='a' || letra=='e' || letra=='i' || letra=='o' || letra=='u')vocal=true
return vocal
}
def vocales(cadena:String): String={}
我很难看到元音函数是否可以递归完成,因为它需要 esVocal 函数中的 yes 或 yes,因为它是一个一个检查字母的函数,但是如果不填充堆栈,我找不到有效的解决方案或做奇怪的事情,提前谢谢。
您可以实现以下提供递归机制的伪代码,其中考虑了 3 个因素:作为源或主字符串的字符串或字符串,开始遍历字符串或字符串的位置,最后是堆栈您将添加元素。
如果你只是想显示或打印值,那么你不应该使用堆栈而只是在它是元音时打印到屏幕上,你只需传递字符串参数来获取元音和函数中的起始位置。一切顺利!:)
PS:我没有使用 Scala 的经验,但我认为这样可以解决您的问题。
我想我找到了一个有效的解决方案:
我不建议您通过索引 (
cadena.charAt
) 访问字符串。它在函数式编程中并不常见,在许多情况下,还有更好的选择。例如,可以用来s.head
代替s.charAt(0)
, 或s.tail
代替s.substring(1)
,同样,在 scala 中,建议不要使用退出函数,这在命令式编程
return
中更为典型。基本上你需要的是创建一个“过滤器”,就像这样简单:
我们可以将其创建为递归函数,将检查函数作为参数传递,如下所示:
有了我们最终将拥有的:
过滤功能可以应用于更多的对象。我们可以创建一个适用于任何类型序列的通用过滤器函数:
有了这个定义,我们的函数
vocales
看起来像这样:顺便说一句,函数
esVocal
也可以变得更简单:我建议您使用尾递归
这样你就不应该对内存堆栈有问题