基本問題(6)

[ edit ]

*


概要

[ edit ]

*


ヒント

この課題で使うPythonの機能 (学習のヒント)

[ edit ]

  • この課題で使うPythonの機能 (学習のヒント) ...
    • 関数定義

    • print()関数

      • キーワードパラメータsepは区切り文字列,キーワードパラメータendは行末文字列です.

この課題の解き方 (問題解決のヒント)

[ edit ]

  • この課題の解き方 (問題解決のヒント) ....
    • 核心部分は,ユークリッドの互除法です.

      • 繰り返しでも再帰関数でも定義できますが,再帰関数の方が簡単かもしれませんね.
        • xとyの最大公約数を求める再帰関数 rec_gcd( x, y) を定義してください.
      • ユークリッドの互除法については,wikipediaをご覧ください

        • (wikipediaの記事から再帰関数を定義するのは,ちょっとわかりにくいので)簡単にまとめると...
          • rec_gcd(x, y)

            • yがゼロならx (割り切れたとき)

            • さもなくば,rec_gcd( y, x%y )

*


実行例

[ edit ]

  • 実行例(1) ... クリックすると拡大します

fig-01

*


プログラム例: 本質的な部分 (授業中に順次公開します)

[ edit ]

  • 解答例の核心部分は,下記の関数です.
  • 繰り返し版
    • タプルについての知識があれば,すこしだけ短くなります→後日やりましょう

def gcd( x, y ):
    while y != 0:
        # x, y = y, x%y # タプルについての知識があれば,すこしだけ短くなります→後日やりましょう
        z = x%y
        x = y
        y = z
    return( x )
  • 【別解 (1)】 再帰版

def rec_gcd(x, y):
    if y == 0:
        return( x )
    else:
        return( rec_gcd( y, x % y ) )
  • 【別解 (2)】 再帰版 (条件式(条件分岐演算子)を使うと簡潔になります.
    • 別に短く書いたからといっても,良い表現とは限りません.
      • だから,試験などでは,特に指定のない限り,単に簡潔だからという理由だけで加点があるということはありません
      • 多少,実行速度には違いが出るかもしれませんが...
        • 繰り返しの中などでは,ちょっとの違いが蓄積して大きくなることもあります
    • とりあえずは,分かり易いのが一番ですよね
      • どれが分かり易いかは,それぞれの人次第です
        • それと習熟度合い次第や,状況次第でもあるでしょう
        • プログラム全体が長くなったり,条件式の表現に慣れるまでは,おそらくif-else文の方が分かり易いのではないでしょうか.

def rec_gcd( x, y ):
    return( x if y == 0 else rec_gcd( y, (x % y) ) )
*


高度な話題 (授業中,もしくは授業後に順次公開します)

[ edit ]

  • 高度な話題へのリンク: 授業の流れを阻害しないように別ページにします

    • (後日の回の授業内容にはなる可能性がありますが,この回の授業内容には含めません).
    • タプル,λ式/条件式(条件分岐演算子; 三項演算子)に関するものです.


プログラム例: 配布コード (授業中に順次公開します)

*

*

SoftEng: Python/Prog/Practice/Basic/02/BP_006a (last edited 2018-10-28 14:44:28 by TadashiIijima)