1

再帰では、分割統治法を使用して問題を細かく分割しているとすると、問題の最初から問題の最後まで、どのようにデータを読み取ることができますか?

encrypt()文字列内の文字を右側の3つのインデックスの文字に置き換える関数があります。

A文字列で例えばに"ABCDEF"なりますD

これまで、右側の3つのインデックスが定義されていないときに停止するまで再帰的に実行しましたが、これにより、文字列の最後のビットが元のビットと同じままになります。

"ABCDEF"になります"DEFDEF"

再帰呼び出し中に文字列の先頭を最も内側の関数に効率的に渡す方法はありますか?

これは現在私のコードです:

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)
4

3 に答える 3

2

これで問題が正確に解決するわけではないかもしれませんが、フィットさせるために少し成形する必要があるかもしれません。私がどこかで見たように、あなたは再帰を望んでいます。文字列の最後に到達したときに、最初に移動する方法を示しました。

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 = 3およびi + 3 = 6- 6 % 6 = 0>最初の文字に戻るとき


を使用したい場合はRecursion、変更したプログラムを次に示します。-

def shift_cipher_noloop(plain, i):

    if(plain == ""):
        return ""

    else:
        # Iterate with your string, moving first character to last on each iteration
        if len(plain) > 3 and i > 0: 
            return shift_cipher_noloop(plain[1:] + plain[0], i - 1)

        else:
            # else Will be executed when either len <= 3, or `i <= 0`.
            # when (i <= 0) is true, you have created a new string, 
            # with each character shifted by `original i` indices. 
            # So, just return it.

            return plain


x = "ABCDEF"
index_to_shift = 3
y = shift_cipher_noloop(x, len(x) - index_to_shift)

print(y)

出力:-

DEFABC

method適切なインデックスを取得するために使用するパラメータをもう1つ追加しました。また、最初の文字を最後に移動するたびに、完全な文字列をメソッドに渡します。

また、の場合はlen(plain) <= 3、文字列を返すだけです。

于 2012-11-23T11:40:10.833 に答える
1

一般に、再帰関数に追加のパラメーターを渡すオプションがあります。再帰関数は、再帰のより深いネストに変更されずに渡されます。また、外部関数のパラメーターに常にアクセスできる内部関数を使用することもできます。

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'
于 2012-11-23T13:12:57.827 に答える
1

再帰を使用する必要がない場合は、単純な文字列メソッドを使用します。

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

RohitJainの答えもとても好きです

于 2012-11-23T11:48:06.293 に答える