给我一个字符串,如果有一个或多个无效字符,则必须返回False,否则返回True。需要注意的是,我只能内置函数和str操作(例如:in,+,indexing,len)和递归。到目前为止,我没有用:
def is_valid_sequence(dna):
""" (str) -> bool
Return True if and only if the DNA sequence is valid
(A, T, C, and G)
:param dna: string sequence
:return: true or false
>>> is_valid_sequence('ATTAC')
True
>>> is_valid_sequence('FBSSS')
False
"""
valid_seq = 0
if len(dna) == 1 and dna in ['A', 'T', 'C', 'G']:
valid_seq += 1
else:
return is_valid_sequence(dna[1:])
显然,由于递归,该代码无法正常工作,并且valid_seq
在下一次递归迭代之后才将变量加1 。
对于小尺寸(约一千个字符)的DNA序列,这是一个实际的实现
def is_valid_sequence (dna):
# base case
if len (dna) == 0:
return True
# check if first character is valid
elif dna [0] not in ['A', 'T', 'C', 'G']:
return False
# otherwise, recurse on the rest of the characters
else:
return is_valid_sequence (dna [1:])
print (is_valid_sequence ('AATGCGA')) # True
print (is_valid_sequence ('AATXGCGA')) # False
注意事项
在python中使用递归要小心-长dna
字符串会导致堆栈溢出。尝试验证甚至这个“大”序列都将失败
GATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGAC
您可以通过is_valid_sequence
使用Clojure样式loop
/recur
机制进行恒定空间递归来轻松避免这种情况
def recur (*values):
return (recur, values)
def loop (f):
acc = f ()
while type (acc) is tuple and acc [0] is recur:
acc = f (*acc [1])
return acc
def is_valid_sequence (dna):
# stack-safe loop/recur implementation
# initialize loop state variable `s` to value of `dna`
return loop (lambda s = dna:
# base case
True if len (s) == 0 else
# check if first character valid
False if s [0] not in ['A', 'T', 'C', 'G'] else
# else recurse on the rest of the characters
recur (s [1:]))
# does not overflow stack
print (is_valid_sequence ('GATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACA'))
# True
持续改进
该loop
/recur
执行暴露给调了更多的机会,我们的函数的性能。按照我们的方式对字符串进行切片,dna[0]
并在内存中dna[1:]
创建
新的 字符串;这仅是必需的,因为在我们编写的第一个函数中使用了递归API
该loop
/recur
接口允许我们使用任何数据类型是适合我们的计算输出-
在这种情况下,一个简单的整数索引就行了。词法作用域处理剩下的dna
事情–在我们的lambda中可以访问,并且不需要进行dna[1:]
切片,这将为大量输入节省大量时间/空间
def is_valid_sequence (dna):
# only create this array once
valid_chars = ['A', 'T', 'C', 'G']
# initialize loop state variable `i` with 0
return loop (lambda i = 0:
True if len (dna) == i else
False if dna [i] not in valid_chars else
recur (i + 1))
Python和不羁的Lambda
请注意,我们是如何被迫在lambda内使用纯表达式而不是传统的if/elif/else
语句语法–这对于简单的程序来说不是问题,但是更复杂的程序可能很难在python中以这种方式表达。
这与上面的程序相同,但是使用普通的旧函数而不是lambda
def is_valid_sequence (dna):
valid_chars = ['A', 'T', 'C', 'G']
# plain old function; replaces lambda
def myloop (i = 0):
if len (dna) == 0:
return True
elif dna [i] not in valid_chars:
return False
else:
return recur (i + 1)
# use plain old function instead of lambda
return loop (myloop)
给我一个字符串,如果有一个或多个无效字符,必须返回False,否则返回true。需要注意的是,我只能内置函数和字符串操作(例如:in,+,indexing,len)和递归。到目前为止,我所掌握的一切都不起作用: 显然,由于递归的原因,这段代码无法工作,在下一次递归迭代之后,将1添加到变量中会被删除。
问题内容: 我正在编写一个小型JAVA程序,该程序: 将文本作为字符串 需要2个字符数组 我试图做的事情听起来像是“查找并替换”,但是并不相同,因此我认为清除它很重要。 无论如何,我想获取此文本,查找第一个数组中的任何字符是否与文本中的字符匹配,如果是,则将其替换为第二个字符数组中的匹配字符(根据索引)。 我将举一个例子来说明:假设我的文本(字符串)是:“ java很棒!”;我有2个数组(char
问题内容: 对于穷人在客户端上实现近似排序规则正确排序的实现,我需要一个JavaScript函数,该函数可以 有效地 替换字符串中的单个字符。 这就是我的意思(请注意,这适用于德语文本,其他语言则有不同的排序方式): 基本上,我需要将给定字符串的所有出现的“ä”替换为“ a”(依此类推)。这样,本机排序的结果将非常接近用户的期望(或数据库将返回的结果)。 其他语言也具有执行此操作的功能:Pytho
问题内容: 我知道使用“ +”串联运算符来构建字符串效率很低,这就是为什么建议使用StringBuilder类的原因,但是我想知道这种模式是否也效率低下? 我猜这里编译器会优化分配,好吗? 问题答案: 该特定示例将由编译器内联: Java 9+将使用带有makeConcatWithConstants的invokedynamic来内联此代码,以使其高效。根据输出: 但是,如果 and 是编译时间常数
问题内容: 快速提问。是否有等效于@的Java字符串: 例如,我可以使用C#进行处理,并使其在处理时忽略转义字符,而不必这样做。是否有Java等效项? 嗯:stackoverflow正在向我逃脱..大声笑。第二个示例应为: c :(双反斜杠)文件夹(双反斜杠)aFile 问题答案: 没有。转义/外部化字符串是您唯一的选择。
所以我在做一个方法,用10000到55555的数字填充一个字符串。这些数字在6位数系统中。这意味着当我们有10005时,下一个数字是10010和11555- 我做了一个for循环,用所有数字填充字符串,但我不知道如何找到3 og更相等的数字。我想我需要另一个带有If语句的for循环,但我只是不明白。尝试同时使用 char 和 int 进行循环,但我显然做错了什么。 这是我目前掌握的情况: 有什么想