プログラミング-演習12 c -再帰とラムダ関数



再帰関数とラムダ関数

This is a continuation of exercise 12 b (A function that returns a value)



再帰関数
関数の作成方法、関数への引数の渡し、関数の呼び出し方について説明しました.私たちはたくさんやった.頻繁に休憩を取るなら、それは私たちを支払うでしょう.

Kindly take a break to revise what we learnt so far and also take a long break away from PC.


この演習では、関数の詳細について議論します.再帰関数は、それ自体を呼び出します.ベースケースが偽になるまで、そうします.
を実装しましょうfactorial 関数.この関数は整数入力になります.入力が1より小さい場合、この関数は1を返します.
整数入力を指定します.n . n 要因はn! = n * (n - 1) * (n - 2) * (n - 3) * ... * 1 . ベースケースは1です.我々が得るとき1 , 再帰関数を中断または終了します.

例1 -ループ用
factorial = 1
n = int(input("Enter n: "))

if n < 1:
    print(1)
else:
    for i in range(1, n+1):
        factorial *= i

    print(factorial)

# input  output
#    3     6
#    5     720
#    15    1307674368000

例2 -関数
さて、再帰関数を使って上記を実装します.
def factorial(n):
    if n < 1:
        return 1

    else:
        return n * factorial(n-1)
  • def factorial(n) : 整数引数と呼ばれる関数を定義します.n .
  • if n < 1: return 1 : ベースケースをチェックし、1を返します.この関数は1を返し、実行を停止します.
  • else: return n * factorial(n-1) : if n > 1 , 帰りますn 乗算factorial(n-1) .
  • If n=5 , 以下のようにします:
  • factorial(5) = 5 * factorial(4)
  • factorial(5) = 5 * 4 * factorial(3)
  • factorial(5) = 5 * 4 * 3 * factorial(2)
  • factorial(5) = 5 * 4 * 3 * 2 * factorial(1)
  • factorial(5) = 5 * 4 * 3 * 2 * 1
  • factorial(5) = 720

  • 例3
    の実装Euclid GCD algorithm . 私たちは2つの数の最大公約数に興味があります.gcd(a, b) .
    アルゴリズム
  • レットa , b 2つの数字である
  • レットr 残りであるa and b , a % b
  • チェックするr is 0 , b 分割するa , もしそうならばb
  • 代入するb to a and r to b そして、第2ステップを繰り返す
  • a = int(input("Enter a: "))
    b = int(input("Enter b: "))
    
    while True:
        r = a % b
    
        if r == 0:
            print(b)
            break
    
        else:
            a = b
            b = r
    
    # a = 72
    # b = 96
    # gcd(a, b) = 24
    

    例4
    再帰の使用
    def gcd(a, b):
        r = a % b
    
        if r == 0:
            return b
    
        else:
            return gcd(b, r)
    
    print(gcd(72, 96))  # 24
    
    このコードを短くしましょう
    def gcd(a, b):
        if a % b == 0:
            return b
    
        return gcd(b, a % b)
    

    ラムダ関数
    ラムダ関数は匿名関数と呼ばれます.名前のない関数です.私たちはそれがワンタイム機能だと言うことができます.を使用してラムダ関数を作成しますlambda キーワード.単に(lambda comma-separated-args: body)
    構造
    与えられた整数を1ずつ増やして値を返す関数を考えましょう.
    def inc(n):
        return n + 1
    
    
    print(inc(2))  # 3
    
    
    上のスニペットはdef 関数を作成するキーワード.では、どのように使用するかを見ましょうlambda キーワードは、同じ関数を作成します.

    例5
    print((lambda x: x+1)(2))  # 3
    
    従って、ラムダ関数の構造は通常の関数と同様です.我々はlambda の代わりにキーワードdef , この関数には名前がありません.パラメータはラムダキーワードから切り離されたスペースコンマです.関数本体はコロンで区切られています.: .
    例5から、ラムダ関数に引数2を渡しました.がどのように渡されたかに注目してください.

    例6
    ラムダ関数に複数の引数を渡すことができます.利用できないことに注意してくださいreturn ラムダ関数.つの数字を比較し、より少ない数を返すラムダ関数を使いましょう.
    print((lambda a, b: a if a < b else b)(2, 4))  # 2
    
    
    ふつう私たちは書きました.
    def min_val(a, b): return a if a < b else b
    
    
    print(min_val(2, 4))  # 2
    
    これは以下の通りです.
    def min_val(a, b):
        if a < b:
            return a
        else:  #  we can comment out the else:
            return b
    

    ラムダ関数に名前を割り当てることができます
    考慮するexample 5 与えられた数を1だけインクリメントする場合、ラムダ関数を変数に渡し、後で関数のような変数を呼び出すことができます.
    inc = (lambda n: n + 1)
    
    print(inc(2))  # 3
    
    あなたは以下のこれらの2つのスニペットの違いを言うことができますか?
    # first func
    inc = (lambda x: x + 1)
    print(inc(4))
    
    # second func
    inc = (lambda x: x + 1)(4)
    print(inc)
    
  • first func , ラムダ関数をinc . inc が呼び出され、値の引数が呼び出されました.4 が渡された.それで、我々はそれを言うことができますinc 関数です.
  • second func , 価値の議論4 がラムダ関数に渡された.結果はinc . So inc もう一つの価値変数です.4 + 1 = 5 関数ではなく.

  • 実践
  • このリストをソートする関数を書きます.[[47, 3, 1, 34], [0. - 3, 4], [7, 21, 13, 37, 8]]
  • 度華氏から摂氏度まで温度を返す関数を書く
  • 指定した範囲の間の数値の合計を返す関数を書き込みます.範囲が1 to 5 , リターン15 .
  • 指定された範囲の間の正方形を印刷する
  • 与えられた整数で個々の数字を合計する関数を書きます.与えられる.12345 , リターン15
  • 指定された年が閏年であるかどうかを検証する関数を書き込みます.閏年である与えられた入力のために、それは4によって分割可能でなければなりません、しかし、(100)によって割り切れることができません、あるいは、入力は400によって分割可能です.

  • 概要
  • 関数は特定のタスクを実行するコードのブロックです
  • 関数は少なくとも0の引数をとることができます
  • 関数定義
  •   def function_name(some_args):
          # some code
    
  • 機能を呼び出すことでfunc_name(some_args)
  • 関数はコードの再利用を可能にする
  • 関数は、コードのどの部分でも使用できます
  • 関数を作成する際に
  • 引数は我々が関数を呼び出しているときに
  • return 関数を終了し、関数から値を返す
  • より多くの引数を集めるために* arg -タプル引数を使用してください
  • 機能はできるだけ多くの回数
  • 再帰関数自体を呼び出す
  • ラムダ関数は、通常、オンザフライで必要な無名関数です