我是编程新手。而且我被要求通过在scala中使用子字符串和递归来计算字符串中特定字符的出现次数。我完全迷失了,我不知道如何检查该字符串中第二个字符的相等性。我不应该使用tailrecursion和map。非常感谢!
到目前为止我的代码看起来像这样:
def countChars(str:String, chr:Char):Int = {
if (str.length == 0) 0
else {
if (chr == str.substring(0,1)) 1
else 0} + countChars()
}
println(countChars())
答案 0 :(得分:2)
首先,这是一个工作版本(没有使用最短的版本,使其更容易阅读):
1
你有两个问题。首先,您没有使用正确的参数调用countChars。更重要的是,也许不是很明显:你将Char与String进行了比较。这永远不会成真:
1
9 9
5 1
1 2
1 4
1 3
3 8
4 9
3 9
4 6
6 7
8
因为import copy
from collections import defaultdict
class Node:
def __init__(self, i):
self.index = i
self.neighbors = []
self.currentPath = []
def createNeighbor(self, neighbor):
self.neighbors.append(neighbor)
def __str__(self):
neighbors = [str(n.index) for n in self.neighbors]
return "(i = %d, neighbors: %s)"%(self.index, " ".join(neighbors))
def __repr__(self):
return str(self)
class Graph:
def __init__(self):
self.nodes = defaultdict(lambda: False)
def neighborNodes(self, node, neighbor):
if not self.nodes[node.index]:
self.nodes[node.index] = node
if not self.nodes[neighbor.index]:
self.nodes[neighbor.index] = neighbor
self.nodes[node.index].createNeighbor(neighbor)
self.nodes[neighbor.index].createNeighbor(node)
def printNeighborsNeighbors(self, start_num):
node = self.nodes[start_num]
print(node.neighbors)
#for n in node.neighbors:
# print(n.neighbors)
def listNodes(self):
for node in self.nodes.values():
print(node)
f = open('input.txt', 'r')
t = int(f.readline())
for _ in range(t):
graph = Graph()
n, m = f.readline().split()
n = int(n)
m = int(m)
for _ in range(m):
x, y = f.readline().split()
x = int(x)
y = int(y)
nodeX = Node(x)
nodeY = Node(y)
graph.neighborNodes(nodeX, nodeY)
s = int(f.readline())
print("running graph.listNodes")
graph.listNodes()
print("running print neighbors neighbors")
graph.printNeighborsNeighbors(4)
或def countChars(str: String, chr: Char): Int = {
if (str.length == 0) {
0
} else {
(if (chr.toString() == str.substring(0, 1)) {
1
} else {
0
}) + countChars(str.substring(1), chr)
}
}
println(countChars("Hello World", 'l')) //> 3
都是先检查类型,所以这是不同的。只需使用类型转换,或者在这种情况下使用简单的chr == str.substring(0,1)
,就像我一样。
希望这会对你有所帮助。
修改抱歉,只是意外按下了帖子按钮。
答案 1 :(得分:2)
这是一个使用每次迭代时第一个字符的存在/值匹配的解决方案:
def countChars(str: String, chr: Char): Int = str.headOption match {
case None => 0
case Some(ch) if ch == chr => 1 + countChars(str.substring(1), chr)
case _ => countChars(str.substring(1), chr)
}
答案 2 :(得分:1)
惯用的scala解决方案将是:
map
我不知道您为什么要使用filter
,但您的问题并未说明不使用{{1}}
答案 3 :(得分:1)
来自@cokeSchlumpf和@Shadowlands的答案,
def countChars(s: String, c: Char): Int = {
if (s.isEmpty) 0
else if (s.substring(0,1).head == c) 1 + countChars(s.substring(1),c)
else countChars(s.substring(1),c)
}