给我一个字符串,如果有一个或多个无效字符,必须返回False,否则返回true。需要注意的是,我只能内置函数和字符串操作(例如: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:])
显然,由于递归的原因,这段代码无法工作,在下一次递归迭代之后,将1添加到valid_seq
变量中会被删除。
对于小尺寸(大约一千个字符)的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 tho中使用递归时要小心--长的dna
字符串会导致堆栈溢出。试图验证即使是如此“大”的序列也会失败
通过使用Clojure样式的循环
/Recur
机制实现is_valid_sequence
,您可以很容易地避免这种情况
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
持续改进
循环
/recur
实现提供了一个优化函数性能的额外机会。像我们对dna[0]
和dna[1:]
所做的那样对字符串进行切片会在内存中创建新的字符串;这是必要的,因为我们编写的第一个函数中使用了递归API
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))
请注意,我们被迫在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。需要注意的是,我只能内置函数和str操作(例如:in,+,indexing,len)和递归。到目前为止,我没有用: 显然,由于递归,该代码无法正常工作,并且在下一次递归迭代之后才将变量加1 。 问题答案: 对于小尺寸(约一千个字符)的DNA序列,这是一个实际的实现 注意事项 在python中使用递归要小心
问题内容: 我正在编写一个小型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 进行循环,但我显然做错了什么。 这是我目前掌握的情况: 有什么想