4

反復関数を使用してパスカルの三角形を作成する割り当てを完了した後、再帰関数を使用してパスカルの三角形を再作成しようとしました。引数として渡された数値に対応する個々の行を生成できるようになりました。しかし、その行までの三角形全体を生成するためのいくつかの試みは失敗しました。入力番号の範囲を反復処理し、リストに個々の行を追加してリストを返す前に、反復桁を使用して再帰関数を呼び出す別の関数を作成してみました。目的の出力は、各内部リストに三角形の1行が含まれるリストのリストである必要があります。そのようです:

[[1], [1, 1], [1, 2, 1]...]

代わりに、完全に1で満たされたネストされたリストの混乱した混乱を返します。

これが問題の再帰関数であり、行を追加する2番目の関数はありません(とにかく1つのオールインクルーシブ関数が本当に必要でした):

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [1]
    else:
        new_row = [1]
        last_row = triangle(n-1)
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
    return new_row

明確にするために、私はすでに割り当てられたタスクを完了しました。これは、再帰のより深い理解を提供するためだけのものです...

反復ソリューション:

def triangle(n):
    result = []
    for row in range(n):
        newrow = [1]
        for col in range(1, row+1):
            newcell = newrow[col-1] * float(row+1-col)/col
            newrow.append(int(newcell))
        result.append(newrow)
    return result
4

3 に答える 3

13

リストのリストを再帰に渡し、リストの最後の要素(つまり、三角形の最後の行)を選択して、新しい行を作成する必要があります。そのようです:

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [[1]]
    else:
        new_row = [1]
        result = triangle(n-1)
        last_row = result[-1]
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
        result.append(new_row)
    return result
于 2012-05-17T01:41:19.297 に答える
4

末尾再帰を使用したhappydaveのソリューションの代替:

def triangle(n, lol=None):
    if lol is None: lol = [[1]]
    if n == 1:
        return lol
    else:
        prev_row = lol[-1]
        new_row = [1] + [sum(i) for i in zip(prev_row, prev_row[1:])] + [1]
        return triangle(n - 1, lol + [new_row])
于 2012-05-17T01:48:45.643 に答える
-1

はい、Karl Knechtelも示したように、再帰的なパスカルの三角形はこのように進むことができます:

P=lambda h:(lambda x:x+[[x+y for x,y in zip(x[-1]+[0],[0]+x[-1])]])(P(h-1))if h>1 else[[1]]
print(P(10))
于 2018-06-03T17:06:28.027 に答える