递归函数拼写元素
Recursive Function Spell Elements
我的代码有以下问题,它是一个递归函数,它的作用是通过周期性 table 的化学元素符号打印单词,如 H、He、Li 、Be、B、C等例如word 'silver'打印成'SiLvEr',使用上面提到的符号,但是在我的程序中有一个问题,因为有一个,两个或三个字母的化学元素符号,然后程序被创建为首先检查一个字母,然后检查两个字母,最后检查三个字母,但是如果程序检查一个字母并且元素存在,那么它将不再检查 2 个和 3 个字母,这就是程序
def spell_elements(palabra:str , lista:list):
if palabra == "":
return ""
if palabra[0].capitalize() in lista:
return palabra[0].capitalize() + spell_elements(palabra.strip(palabra[0]), Elementos)
if palabra[:2].capitalize() in lista:
return palabra[:2].capitalize() + spell_elements(palabra.strip(palabra[:2]), Elementos)
if palabra[:3].capitalize() in lista:
return palabra[:3].capitalize() + spell_elements(palabra.strip(palabra[:3]), Elementos)
else:
return ""
En este caso para el ejemplo de silver tenemos:
Elementos = ['H','He','Li','Be','B','C','N','O','F','Ne','Na','Mg','Al','Si','P','S','Cl','Ar','K','Ca',
'Sc','Ti','V','Cr','Mn','Fe','Co','Ni','Cu','Zn','Ga','Ge','As','Se','Br','Kr','Rb','Sr',
'Y','Zr','Nb','Mo','Tc','Ru','Rh','Pd','Ag','Cd','In','Sn','Sb','Te','I','Xe','Cs','Ba','La',
'Ce','Pr','Nd','Pm','Sm','Eu','Gd','Tb','Dy','Ho','Er','Tm','Yb','Lu','Hf','Ta','W','Re','Os','Ir',
'Pt','Au','Hg','Tl','Pb','Bi','Po','At','Rn','Fr','Ra','Ac','Th','Pa','U','Np','Pu','Am','Cm',
'Bk','Cf','Es','Fm','Md','No','Lr','Rf','Db','Sg','Bh','Hs','Mt','Ds','Rg','Cn','Uut','Fl','Uup','Lv',
'Uus','Uuo']
print(spell_elements('arsenic', Elementos)
# Output -> Ars
所以在这种情况下它首先找到列表元素中的元素'Ar',第二个元素将其作为'S',但后来它不再输入取两个字符'Se' 如果它在“Elements”列表中,那么我想看看我的函数是否有一些方法,虽然列表 Elements 中有一个元素但没有引导我们做任何事情,检查其他两个条件 'If' 因为其中一些可能导致解决方案。
一定是这样的
print(spell_elements('arsenic', Elementos)
# Output -> ArSeNIC
您必须遍历第一部分的所有大小,如果递归可以找到解决方案,则只有 return 结果:
def spell_elements(S,symbols):
for size in (1,2,3): # try each size
prefix = S[:size].capitalize() # get prefix
if prefix not in symbols: continue # not in symbols
if len(S)==size: return prefix # single symbol
suffix = spell_elements(S[size:],symbols) # solution for rest
if suffix: return prefix+suffix # return full solution
print(spell_elements('arsenic',Elementos)) # ArSeNIC
请注意,如果您按降序检查尺寸(这会 return ArSeNiC
)
,这可能会更好
我的代码有以下问题,它是一个递归函数,它的作用是通过周期性 table 的化学元素符号打印单词,如 H、He、Li 、Be、B、C等例如word 'silver'打印成'SiLvEr',使用上面提到的符号,但是在我的程序中有一个问题,因为有一个,两个或三个字母的化学元素符号,然后程序被创建为首先检查一个字母,然后检查两个字母,最后检查三个字母,但是如果程序检查一个字母并且元素存在,那么它将不再检查 2 个和 3 个字母,这就是程序
def spell_elements(palabra:str , lista:list):
if palabra == "":
return ""
if palabra[0].capitalize() in lista:
return palabra[0].capitalize() + spell_elements(palabra.strip(palabra[0]), Elementos)
if palabra[:2].capitalize() in lista:
return palabra[:2].capitalize() + spell_elements(palabra.strip(palabra[:2]), Elementos)
if palabra[:3].capitalize() in lista:
return palabra[:3].capitalize() + spell_elements(palabra.strip(palabra[:3]), Elementos)
else:
return ""
En este caso para el ejemplo de silver tenemos:
Elementos = ['H','He','Li','Be','B','C','N','O','F','Ne','Na','Mg','Al','Si','P','S','Cl','Ar','K','Ca',
'Sc','Ti','V','Cr','Mn','Fe','Co','Ni','Cu','Zn','Ga','Ge','As','Se','Br','Kr','Rb','Sr',
'Y','Zr','Nb','Mo','Tc','Ru','Rh','Pd','Ag','Cd','In','Sn','Sb','Te','I','Xe','Cs','Ba','La',
'Ce','Pr','Nd','Pm','Sm','Eu','Gd','Tb','Dy','Ho','Er','Tm','Yb','Lu','Hf','Ta','W','Re','Os','Ir',
'Pt','Au','Hg','Tl','Pb','Bi','Po','At','Rn','Fr','Ra','Ac','Th','Pa','U','Np','Pu','Am','Cm',
'Bk','Cf','Es','Fm','Md','No','Lr','Rf','Db','Sg','Bh','Hs','Mt','Ds','Rg','Cn','Uut','Fl','Uup','Lv',
'Uus','Uuo']
print(spell_elements('arsenic', Elementos)
# Output -> Ars
所以在这种情况下它首先找到列表元素中的元素'Ar',第二个元素将其作为'S',但后来它不再输入取两个字符'Se' 如果它在“Elements”列表中,那么我想看看我的函数是否有一些方法,虽然列表 Elements 中有一个元素但没有引导我们做任何事情,检查其他两个条件 'If' 因为其中一些可能导致解决方案。
一定是这样的
print(spell_elements('arsenic', Elementos)
# Output -> ArSeNIC
您必须遍历第一部分的所有大小,如果递归可以找到解决方案,则只有 return 结果:
def spell_elements(S,symbols):
for size in (1,2,3): # try each size
prefix = S[:size].capitalize() # get prefix
if prefix not in symbols: continue # not in symbols
if len(S)==size: return prefix # single symbol
suffix = spell_elements(S[size:],symbols) # solution for rest
if suffix: return prefix+suffix # return full solution
print(spell_elements('arsenic',Elementos)) # ArSeNIC
请注意,如果您按降序检查尺寸(这会 return ArSeNiC
)