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

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

新規登録して質問してみよう
ただいま回答率
87.20%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

同一名関数を同時に再帰的に呼び出した場合の実行手順と実行結果の再利用のされ方について

sequelanonymous
sequelanonymous

総合スコア123

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3回答

0評価

0クリップ

523閲覧

投稿2021/09/20 08:25

同じ関数を再帰的に同時に二回呼び出した場合の実行順番があっているのかどうかが不安になります。
下記アウトプットに記載していますが、どういう順番で呼び出されていますでしょうか?
また、片方がbase caseでたどりついた場合、未実行の片方の関数の実行結果はどこにいってしまうのでしょうか?

下記、詳細な質問の説明と背景になります。
ーーー
例えば、下記コードでは、はじめに左側にある関数が再帰的にbase caseまで呼び出され、base caseまでたどり着いたあとは、右側の関数実行にいくのではなく、一回base caseで返したreturnの値を右側関数を無視してresに入力するって言う理解であっていますでしょうか?
res = recur_array_index(num, i-1) + recur_array_index(nums[1:], i)

私の最初の理解では、左側の関数呼び出しがbase caseまでたどり着いたら、下記のような形になり左側関数がbase caseにたどり着いたときの引数で右側の関数を実行すると思っていました。
res = [[]] + recur_array_index(nums[1:], i)

つまり、右側関数が同じくbase caseまで呼び出され、下記のような形でresが返ると思っていました。
res = [[]] + []

しかし、print文をつかって出力したところ、そういう順番でresが出力されていないことがわかり、どういう順番で実行されるのかなと思いました。

ーーー

python

def recur_array(nums): i = len(nums) def recur_array_index(nums, i): if i == 0: return [[]] elif not nums: return [] num = nums[1:] print(f"nums: {nums}, num: {num}, i: {i}") res = recur_array_index(num, i-1) + recur_array_index(nums[1:], i) print(f"res: {res}") return res return recur_array_index(nums, i) if __name__ == "__main__": nums = [1,2,3,4] print(recur_array(nums))

アウトプット

shell

$ python recursion.py nums: [1, 2, 3, 4], num: [2, 3, 4], i: 4 nums: [2, 3, 4], num: [3, 4], i: 3 nums: [3, 4], num: [4], i: 2 nums: [4], num: [], i: 1 res: [[]] ------------------> 左側の関数の返り値がresにはいって出力されている。 nums: [4], num: [], i: 2 -----> 右側の関数が再帰的に呼び出されている??? res: [] --------------------> 右側の関数の返り値がresにはいって出力されている。 res: [[]] ------------------> 左側の関数の返り値がresにはいって出力されている。なぜ、左側の関数を呼び出しはじめた??? nums: [3, 4], num: [4], i: 3 -----> 左側の関数が再帰的に呼び出されている??? nums: [4], num: [], i: 2 res: [] --------------------> 右側の関数の返り値がresにはいって出力されている。 nums: [4], num: [], i: 3 res: [] res: [] res: [[]] nums: [2, 3, 4], num: [3, 4], i: 4 nums: [3, 4], num: [4], i: 3 nums: [4], num: [], i: 2 res: [] nums: [4], num: [], i: 3 res: [] res: [] nums: [3, 4], num: [4], i: 4 nums: [4], num: [], i: 3 res: [] nums: [4], num: [], i: 4 res: [] res: [] res: [] res: [[]] [[]]

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。