在字符串上递归回到字符串的开头?

2024-06-17 15:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在递归中,您使用分而治之的方法将问题分解为更小的部分,那么您如何能够从问题的开始、问题的结尾读取数据呢?在

示例:我有一个an encrypt()函数,它将字符串中的字符替换为右边的3个索引:

例如,字符串"ABCDEF"中的A变成{}

到目前为止,我递归地执行它,直到当右边的3个索引未定义时它停止,但是这会使字符串的最后一位与原始的相同。在

示例"ABCDEF"变成{}

在递归调用期间,有没有一种方法可以有效地将字符串的开头传递给最里面的函数?在

这是我当前的代码:

def shift_cipher_noloop(plain):

    encrypted = ""

    if(plain == ""):
        encrypted = ""

    else:
        if(len(plain) > 3):            
            temp_sub = plain[3]          
            encrypted = encrypted + temp_sub
            encrypted = encrypted + shift_cipher_noloop(plain[1:])

        else:
            temp_sub = plain[0] 
            encrypted = encrypted + temp_sub
            encrypted = encrypted + shift_cipher_noloop(plain[1:])

    return encrypted

x = "ABCDEFGHIJK"

y = shift_cipher_noloop(x)

print(y)

Tags: 方法函数字符串示例ifshift结尾读取数据
3条回答

一般来说,可以选择将一个附加参数传递到递归函数中,该函数不变地向下传递到递归的深层嵌套中。您还可以使用内部函数,该函数始终可以访问外部函数的参数:

def shift_cipher_noloop(original):
  def encrypt_recursion(plain):
    encrypted = ""
    if plain == "":
      encrypted = ""
    elif len(plain) > 3:
      encrypted += plain[3]
      encrypted += encrypt_recursion(plain[1:])
    else:
      encrypted += original[3-len(plain)]
      encrypted += encrypt_recursion(plain[1:])
    return encrypted
  return encrypt_recursion(original)

shift_cipher_noloop('abcdefghijklop')
'defghijklopabc'

如果不必使用递归,那么我将使用简单的字符串方法。在

def encrypt(text):
  return text[3:] + text[:3]

我也很喜欢罗希特·贾因的回答

也许这并不能完全解决你的问题,但你可能需要塑造它一点,使它适合。我看到你想要递归。我刚刚演示了当你到达绳子的末端时,你如何移动到开头。在

i + 3的模数与字符串长度自动移到开头:

>>> my_str = "ABCDEF"
>>> length = len(my_str)

>>> for i in range(length):
        print my_str[(i + 3) % length],


D E F A B C

所以,当i = 3i + 3 = 6,和{}->;返回到第一个字符


如果您想使用Recursion,这里是您修改过的程序:

^{pr2}$

输出:-

DEFABC

我在您的method中又添加了一个参数,我用它来获取适当的索引。而且,每次将第一个字符移到末尾时,我都会将完整的字符串传递给方法。在

另外,如果len(plain) <= 3,您可以简单地返回字符串。在

相关问题 更多 >