質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

一度出力した値を同じ関数に引数として再度入力する方法

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 341

Hayato0513

score 16

一度関数で出力した値を同じ関数に再度引数として入力して値を出力する方法を教えてください。
ネットでめちゃくちゃ調べてみたんですけど、なかなか納得のいく答えが見つかりませんでした。
個人的には関数の中に関数を組み込むのかなと思ったんですけど、違うようにも思えてしまって。
端的に軽くでも全然いいので、一言アドバイス的な感じでアイディアとして教えてもらえるだけでもすごく助かります。
丸投げみたいな質問になっているのは承知なのですが、どれだけ調べても出てこなかったのでどうかよろしくお願いします。お知恵を貸してください。

例、ある2つの引数が関数に入って、その関数内で2つの数同士で割算をし、その商と余りをまた同じ関数に引数としてまた入力して割り算するようなものです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2019/06/29 00:24

    再帰(自分自身を呼び出す)じゃいけませんか?
    この場合、終了条件に注意が必要ですが。

    キャンセル

  • otn

    2019/06/29 00:31

    > 例、ある2つの引数が関数に入って、(以下略)

    ふつうにそのまま、その通り書けば良いと思いますが。

    キャンセル

  • Hayato0513

    2019/06/29 13:47

    やはり再帰が有効かもしれません!ありがとうございます!やって見ます!

    キャンセル

回答 4

checkベストアンサー

+2

2回

result = some_func(some_func(param))

複数回

prev = first
while 継続する条件:
    prev = some_func(prev)
prev = first
while True:
    if 終了する条件1:
        break

    if 終了する条件2:
        break

    prev = some_func(prev)


みたいな無限ループもよく書かれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/29 13:49

    ベストアンサーにさえてもらいます!!ありがとうございます!!

    キャンセル

+2

コメントついてる通りではあるんですが…。

一度関数で出力した値を同じ関数に再度引数として入力して値を出力する

というフローが1回だけの繰り返せばいいなら単純に2回呼べばいいんですが、そうじゃなくて何らかの終了条件を満たすまで繰り返したい、という場合には再帰呼び出しを行います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/29 13:49

    再帰についてもう一回勉強して見ます!!

    キャンセル

+1

次のコードを研究してみてください。
while ループで呼び出しを繰り返す版と、再帰呼び出しさせる版を示しています。
x.py

def cal(arg):
    print(arg)
    if len(arg) == 2 and arg[1] != 0:
        return [arg[0] // arg[1], arg[0] % arg[1]]
    return []

# 1回の呼び出し
print(cal([10, 3]))

# 2回の呼び出し
print()
arg = [9999, 13]
print(cal(cal(arg)))

# 3回の呼び出し
print()
arg = [9999, 13]
print(cal(cal(cal(arg))))

# 計算が可能限り呼び続ける
print()
arg = [9999, 23]
while True:
    if len(arg) != 2:
        break
    arg = cal(arg)

# 再帰呼出し
def rec_cal(arg):
    if len(arg) == 2 and arg[1] != 0:
        print(arg)
        rec_cal([arg[0] // arg[1], arg[0] % arg[1]])

arg = [9999, 23]
print()
rec_cal(arg)

実行例
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/05 14:17

    まさに模範解答です!!再帰呼び出し、while と関数を使った無限ループ本当に参考になりました!!ありがとうございます!!

    キャンセル

  • 2019/07/05 14:20

    あと1つだけ質問なんですが、最初の関数の後にreturn[] があるのですがこれは具体的にどういった役割のものなんですか??

    キャンセル

  • 2019/07/05 22:08

    return [] がない版と ある版で print(cal(cal([]))) を実行してみてください。
    return [] がないではエラーが発生してしまいます。

    キャンセル

0

例、ある2つの引数が関数に入って、その関数内で2つの数同士で割算をし、その商と余りをまた同じ関数に引数としてまた入力して割り算するようなものです。

def div_mod(x, y):
    return x // y, x % y

a = 101
b = 7
print(a, b)
a, b = div_mod(a, b)
print(a, b)
a, b = div_mod(a, b)
print(a, b)


実際には divmod という関数があるので div_mod は不要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/29 13:48

    ありがとうございます!!!非常にわかりやすくて助かりました!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る