2

n を取って出力する単純な関数を取得しようとしています

If n > 0:
    print((n*'*')+(n*'!'), end=' ')

同じ解決策を再帰的に取得しようとしています。私は再帰の初心者であり、「より高いレベルの思考」を得ることがよくありますが、従わなければならないコードを理解するのに苦労しています。

私の基本的なケースは、n が 0 の場合、何も出力しないということです。n が 1 より大きい場合、n 部の * + n 部の!

def repeat(n):
    if n <= 0:
        pass
    else:
        repeat(n-1)
        print((n*'*')+(n*'!'), end=' ')

現在、n、次にn-1を0まで連続して出力します.2つのprintステートメントに分割し、複数の再帰を使用しようとしました..しかし、それは厄介なパターンになります.

ループの使用も許可されていません。これは私を狂わせます。簡単な1行のステートメント以外に、いくつかの解決策を思いつきましたが、再帰を使用するものはありません。

4

5 に答える 5

3

次のように、文字列を作成して返し、関数の外に出力すると簡単です。

def printPattern(n):
    if n <= 0:
        return ''
    return '*' + printPattern(n-1) + '!'

またはワンライナーとして:

def printPattern(n):
    return '*' + printPattern(n-1) + '!' if n > 0 else ''

いずれにせよ、これは機能します:

print printPattern(5)
> *****!!!!!
于 2012-10-26T21:24:32.523 に答える
1

以下は、あなたが望むように見えることを行います。

def repeat(n):
  def stars(n):
    return '*'+stars(n-1)+'!' if n > 0 else ''
  print stars(n)

たとえば、repeat(5)印刷物*****!!!!!repeat(8)印刷物 ********!!!!!!!!です。

于 2012-10-26T21:27:05.550 に答える
1

の解があるとしますn - 1。先頭*に追加して追加します!

def repeat(n):
    if n > 0:
        print("*", end=" ")
        repeat(n - 1)
        print("!", end=" ")
于 2012-10-26T21:23:48.197 に答える
0

私はあなたが何を求めているのか実際にはわかりません...これを行うためのより効率的またはより良い方法があるかどうか?これは非常に明白です:

def repeat(n):
    if n >= 0:
        print((n*'*')+(n*'!'), end=' ')
        return repeat(n-1)
于 2012-10-26T21:18:00.060 に答える
0

ここでは2つの文字列を使用し、関数内で出力する代わりにn<=0、を使用すると、これら2つの文字列の連結文字列を返します。return

def repeat(n, strs1="", strs2=""):     # The Default value of strings is ""

    if n <= 0:
        return strs1 + strs2   # if n<=0 then concatenate the two strings and return them
    else:
        strs1 += "*"          # Add * to strs1
        strs2 += "!"          # Add ! to strs2
        return repeat(n-1, strs1, strs2)  # Pass n-1, as well as the two strings to a recursive call

print(repeat(5))
print(repeat(3))

出力:

*****!!!!!
***!!!
于 2012-10-26T21:18:34.317 に答える