Pythonの関数チュートリアル:バイナリサーチアルゴリズム解析Pythonの再帰関数

この記事では、バイナリサーチアルゴリズム、非常に詳細に説明した紙のサンプルコード解析し、次のPython再帰関数を導入して習得したり、作業する私たちのすべてのための学習の一定の基準値を持って、困っている友達はを参照することができ
、最初の再帰

再帰関数:関数自体への関数呼び出しインチ

再帰の最大の深さ:998

あなただけ見てきたように外力が実装されていない場合は、再帰関数がブロックされています。私たちは、関数呼び出しについての質問の前に言ったようしかし、すべての関数呼び出しは、あなたがそれを呼び出すようになっている場合は、ので、この現象のpythonを停止するために、名前空間を作成し、あまりにも多くのメモリの問題を取るだろう、独自の名前のスペースを持っています、997で制御の再帰的な層を強制的に(長い997として!あなたが不利益を購入することはできませんとして、購入...だまされません)。

この「理論上998」は意味あることを証明することは何ですか?ここでは、実験を行うことができます。

def foo(n):
  print(n)
  n += 1
  foo(n)
foo(1)

このことから、我々は最大数はもちろん998で見ることはできません与えられる前に、997のデフォルト値が設定の私達のメモリを最適化するためのpythonプログラムである、ことを確認することができ、もちろん、我々はまた、いくつかの手段でそれを変更することができます:

import sys
print(sys.setrecursionlimit(100000))

私たちは、コンピュータの実際の性能に依存して実現することができる深さとして私たちは、Pythonの再帰の深さは10ワットに設定されていることができます、このように再帰の最大の深さを変更することができます。しかし、我々はまだ再帰層997との問題は解決しないのいずれかを使用再帰はどちらかあなたがコードを書く吸う解決するためには適していませんない場合ので、このデフォルトの再帰の深さを変更することはお勧めしません~~~

真簡単にそれを使用しながら、それが優れている、あなたも良いことではありませんどのような再帰を見つけることがあり、ここを参照してください!しかし、このスプレッドは、川や湖にと呼ばれるこの言葉:人々はサイクルを理解し、神は、再帰を理解しています。あなたは過小評価再帰関数ことはできませんので、多くの人々はそれが再帰の本当の意味を理解することができないが、非常に多くの年の偉大な神のしきい値外に停止しています。そして、我々は多くのアルゴリズムと再帰的な関係を検討します。さあ、私は唯一の資本を軽蔑することを学びました!

第二に、説明する再帰的な例として
、ここでは、我々は再帰を行うことができます説明するために例を与える必要があります。

例一:

今、あなたは、アレックスの先生何歳私に尋ねますか?私は、私はあなたを教えていないと述べたが、エゴンよりアレックス2歳年上。

あなたが依頼する必要がどのくらいかを知りたいアレックスはエゴンではないでしょうか?エゴン私は先生、あなたを教えていないが、私は2年が古い争う、と言います。

あなたは呉先生を尋ね、何の先生呉は、彼が白より2歳年上だったと述べ、あなたに言っていません。

そして、あなたは彼が18 A、白はあなたに言った、白をお願いします。

あなたが知っているされていないこの時間?アレックスくらいですか?ここに画像を挿入説明
なぜあなたは知っていることができますか?

まず第一に、あなたはアレックスの年齢を求めていない、結果はエゴン、呉先生、白を見つけ、一人の子供が過去にあなたを尋ねいずれかによって、彼らは最後のアレックスを取得する前に、バックこの線に沿って、それを取得し、その後、決定的な答えを得るためになっています年齢の。このプロセスは、再帰の考え方に非常に近くなっています。私たちは、これらの人々の間で具体的な、法律を分析する私に来ます。

age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40

そのように、Aの状況、我々はそれを書くかの機能?

def age(n):
  if n == 1:
    return 40
  else:
    return age(n-1)+2
print(age(4))

あなたは66のリストから場所を見つけることができるように、Aリストがある場合、あなたはどのように行うのでしょうか?

L = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83 88]
あなたがそう簡単に言います!

l.index(66)...

Pythonは、私たちは、ルックアップ方法を達成するのを助けるためにあるため、我々は、インデックスメソッドで見つけることができる理由。場合は、使用するために、インデックスメソッドではありません。あなたはその66それ見つけることができますか?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
i = 0
for num in l:
  if num == 66:
    print(i)
  i+=1

ここで、リストから場所を見つけるために66を達成するために、上記方法。

しかし、我々は今、この番号を見つけるどのようにああですか?このリストは、それを見つけるために、一つ一つを循環していませんか?私たちのリストには、特に長い、数を数十万人を取った場合には不運が何百何千回ものを比較するのではない場合、我々は番号を見つけますか?この効率が低すぎる、我々は新しい方法を考える必要があります。

バイナリサーチアルゴリズム

L = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83 88]
あなたは、このリストを見て、それは順序付きリスト、それの大規模なソートを小さくありませんか?

もしそうなら、私は、リストの途中で数より数の大きいを探していた場合、それはリストの半分の後の行に私に直接ではないでしょうか?ここに画像を挿入説明
これは、バイナリサーチアルゴリズムであります!

だから我々はそれを達成するためにどのようにコードを実装する必要がありますか?

単純な二分法のバージョン

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,aim):
  mid = (len(l)-1)//2
  if l:
    if aim > l[mid]:
      func(l[mid+1:],aim)
    elif aim < l[mid]:
      func(l[:mid],aim)
    elif aim == l[mid]:
      print("bingo",mid)
  else:
    print('找不到')
func(l,66)
func(l,6)

二分法のアップグレード版

l1 = [1, 2, 4, 5, 7, 9]
def two_search(l,aim,start=0,end=None):
  end = len(l)-1 if end is None else end
  mid_index = (end - start) // 2 + start
  if end >= start:
    if aim > l[mid_index]:
      return two_search(l,aim,start=mid_index+1,end=end)
    elif aim < l[mid_index]:
      return two_search(l,aim,start=start,end=mid_index-1)
 
    elif aim == l[mid_index]:
      return mid_index
    else:
      return '没有此值'
  else:
    return '没有此值'
print(two_search(l1,9))

最後に、我々は非常に広いPythonの学習リソースの収集をお勧めします、[入力する]をクリック]、ここでのビジネス経験の可能性がある、経験、研究ノートを学ぶ前に、私のコレクションであり、プロジェクトの戦闘への情報に基づいてゼロに沈静化、我々は一番下に、メッセージを残し、前方に置くことを知らないことができ、我々は進歩を一緒に勉強します

公開された24元の記事 ウォン称賛38 ビュー20000 +

おすすめ

転載: blog.csdn.net/haoxun10/article/details/104761438