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