Python関数の再帰(再帰を使用して1からnの合計を見つけるには、再帰を使用してn番目のフィボナッチ数を見つけ、ネストされたリスト内の数値の合計を見つけてすばやく並べ替えます)

再帰関数

簡単に言えば、自分で調整します。再帰で最も重要なことは、出口(つまり、停止する条件)を見つけることです。

cou = 5
def say_love():
    print('我爱你',end=' ')# 把这五个我爱你打在一行
    global cou
    cou = cou-1
    if cou>0:
        say_love()
say_love()# '我爱你 ''我爱你 ''我爱你 ''我爱你 ''我爱你 '

簡単なデモンストレーションですが、これには判断のためにグローバルスカラーを呼び出す必要があります。パラメーターを直接渡し、returnを使用して関数を返すこともできます。次のデモンストレーションを参照してください。

def say_love2(n):
    if n > 0:
        print('我爱你',end=' ')
        return say_love2(n-1)

say_love2(5)# '我爱你 ''我爱你 ''我爱你 ''我爱你 ''我爱你 '

他の書き方もありますが、1つずつリストすることはしません。
いくつかの簡単な演習を行いましょう

1.再帰を使用して、1からnの合計を求めます

def mysum(n):
    if n == 1:# 停止条件 当n等于1的时候返回1
        return 1
    return n + mysum(n-1)
    #要是实在还是没理解,可以把这个式子在草稿纸上写出来就很容易看懂了

s = mysum(100)
print(s)# 5050

2.再帰を使用してn番目のフィボナッチ数を見つけます

# 斐波那契数列:1,1,2,3,5,8,13,21,34,55....
def feibo(n):
    if n == 1 or n == 2:# 停止条件
    # 后面的数是不是都是由最前面两个数'相加'得来的
    # 这里的相加是指以它两为基数相加得来的
        return 1
    return feibo(n-1)+feibo(n-2)# 第n个数是由前两个数相加得来的

f = feibo(10)
print(f) # 55

3.ネストされたリストで数値の合計を見つけます

リスト、タプル、文字列、整数、浮動小数点数をリストにネストできます。ここでは、ループして数値かどうかを判断する必要があります。リストの場合は、直接追加する必要があります。判断では、ネストは2レベルに制限されません
。isinstance()とtype()の違い:
type()はサブクラスを親タイプとは見なさず、継承関係も考慮しません
。isinstance()はサブクラスを考慮します。親タイプとして、継承関係を考慮してください。

lists = [1,2,5,[1,7,3,'a'],(1,2),'abc',3]
def sum_num(n):
    s = 0
    for i in n:
        if isinstance(i,(int,float)):
        # if type(i) == int or type(i) == float:
            s += i
        if isinstance(i,(tuple,list)):
        # if type(i) == tuple or type(i) == list:
            s += sum_num(i)
    return s
print(sum_num(lists))# 25

4.クイックソート

リスト内の数値に移動して削除し、再度リストをトラバースします。取得した数値よりも大きい数値が右側のリストに配置され、小さい数値が左側のリストに配置されます。最後に、関数はこれらの数値にプラスを返します。 、実際の操作は以下のとおりです。可能性はわかりませんが、QAQに悪影響を及ぼします。

'''
             [4, 2, 6, 7, 5, 1, 3, 8, 9]
             
             [4, 2, 1, 3]          [5]    [6, 7, 8, 9]
             [] [1] [4,2,3]        [5]    [6,7]    [8] [9]
             [] [1] [][2][4,3]     [5]    [6][7][] [8] [9]
             [] [1] [][2][][3][4]  [5]    [6][7][] [8] [9]
'''
def quick_sort(l):
    # 结束条件
    if len(l) <= 1:
        return l
    # 1.取一个元素
    middle = l.pop(len(l)//2)
    # 2.定义2个列表:left,right,分别存放小于middle,和大于middle的元素
    left = []
    right = []
    for n in l:
        if n < middle:
            left.append(n)
        else:
            right.append(n)

    print(left, [middle], right)# 可以用来查看排序的实现
    # 函数递归
    return quick_sort(left) + [middle] + quick_sort(right)
l = [4, 2, 6, 7, 5, 1, 3, 8, 9]
print(quick_sort(l))

注:可能であれば再帰を使用しないようにしてください

再帰の効率は低く、再帰の深さは制限されています。この深さを超えると、例外がスローされます。
ここでは、再帰の深さを変更する必要があり、sysモジュールを使用する必要があります。

import sys
sys.setrecursionlimit(1000000)
簡単な要約、好きではない、スプレーしない
また、条件が許せば、いいね、コメント、フォローすることができます。
QAQ

おすすめ

転載: blog.csdn.net/hmh4640219/article/details/112990437