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

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

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

再帰

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

Python

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

Q&A

解決済

3回答

1358閲覧

再帰を用いた関数から返り値が返ってこない

kay_ventris4

総合スコア269

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

再帰

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

Python

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

0グッド

0クリップ

投稿2021/07/13 01:38

編集2021/07/13 01:49

※別途質問した内容と用いるコードは同じものですが、質問の内容が異なる為改めて質問を立てさせて頂きます。

#質問
深さ優先探索によって迷路のスタートからゴールまでの手順を調べる関数を作っていました。迷路リストは障壁が9, 未踏部分が0, ゴールが1, 既に踏んだ部分は2としています、参考にしている本では、以下のようなコードが示されています:

Python

1maze = [ 2 [9, 9, 9, 9, 9, 9], 3 [9, 0, 0, 0, 0, 9], 4 [9, 0, 0, 0, 0, 9], 5 [9, 0, 0, 0, 0, 9], 6 [9, 0, 1, 0, 0, 9], 7 [9, 9, 9, 9, 9, 9] 8] 9 10 11def dfs(x, y, d): 12 if maze[x][y] == 1: 13 print(d) 14 exit() 15 16 maze[x][y] = 2 17 18 if maze[x - 1][y] < 2: 19 dfs(x - 1, y, d + 1) 20 if maze[x + 1][y] < 2: 21 dfs(x + 1, y, d + 1) 22 if maze[x][y - 1] < 2: 23 dfs(x, y - 1, d + 1) 24 if maze[x][y + 1] < 2: 25 dfs(x, y + 1, d + 1) 26 27 maze[x][y] = 0 28 29 30dfs(1, 1, 0)

ここで、求められた返り値が必要になった為、

Python

1maze = [ 2 [9, 9, 9, 9, 9, 9], 3 [9, 0, 0, 0, 0, 9], 4 [9, 0, 0, 0, 0, 9], 5 [9, 0, 0, 0, 0, 9], 6 [9, 0, 1, 0, 0, 9], 7 [9, 9, 9, 9, 9, 9] 8] 9 10 11def dfs(x, y, d): 12 if maze[x][y] == 1: 13 return d 14 15 maze[x][y] = 2 16 17 if maze[x - 1][y] < 2: 18 dfs(x - 1, y, d + 1) 19 if maze[x + 1][y] < 2: 20 dfs(x + 1, y, d + 1) 21 if maze[x][y - 1] < 2: 22 dfs(x, y - 1, d + 1) 23 if maze[x][y + 1] < 2: 24 dfs(x, y + 1, d + 1) 25 26 maze[x][y] = 0 27 28 29depth = dfs(1, 1, 0) 30print(depth)

としたのですが、こうするとどのような迷路に対しても None が出力されます。
どのような理由で求められた値がprintをreturnにしただけでNoneになってしまったのでしょうか。おそらく大変初歩的な質問とは存じ上げますが、何卒ご教授のほどよろしくお願い申し上げます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

python

1def dfs(x, y, d): 2 if maze[x][y] == 1: 3 return d 4 5 maze[x][y] = 2 6 7 if maze[x - 1][y] < 2: 8 dfs(x - 1, y, d + 1) 9 if maze[x + 1][y] < 2: 10 dfs(x + 1, y, d + 1) 11 if maze[x][y - 1] < 2: 12 dfs(x, y - 1, d + 1) 13 if maze[x][y + 1] < 2: 14 dfs(x, y + 1, d + 1) 15 16 maze[x][y] = 0

これをreturnに着目して読むと

dfs(x, y, d)maze[x][y] == 1であればdを返し、そうでなければ何も返さない(None)」
です。

意図のようなコードはこちら

python

1# coding: utf-8 2# Your code here! 3 4maze = [ 5[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9], 6[9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9], 7[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9], 8[9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9], 9[9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 0, 9], 10[9, 9, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9], 11[9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9], 12[9, 1, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9], 13[9, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9], 14[9, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9], 15[9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9], 16[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] 17] 18 19 20def dfs(x, y, d): 21 if maze[x][y] == 1: 22 return d 23 24 maze[x][y] = 2 25 26 if maze[x - 1][y] < 2: 27 r = dfs(x - 1, y, d + 1) 28 if r is not None: 29 return r 30 31 if maze[x + 1][y] < 2: 32 r = dfs(x + 1, y, d + 1) 33 if r is not None: 34 return r 35 36 if maze[x][y - 1] < 2: 37 r = dfs(x, y - 1, d + 1) 38 if r is not None: 39 return r 40 41 if maze[x][y + 1] < 2: 42 r = dfs(x, y + 1, d + 1) 43 if r is not None: 44 return r 45 46 maze[x][y] = 0 47 return None 48 49 50print(dfs(1, 1, 0))

投稿2021/07/13 02:05

編集2021/07/13 02:58
ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kay_ventris4

2021/07/13 02:06

ご丁寧にありがとうございました。 勉強になりました。
kay_ventris4

2021/07/13 02:43

たびたび申し訳ございません。 ほとんどのケースではうまくいったのですが、 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9] [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9] [9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9] [9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 0, 9] [9, 9, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9] [9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9] [9, 1, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9] [9, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9] [9, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9] [9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9] [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] の迷路(スタートをmaze[1][1])で頂いたコードを実行したところ、 本来は50と出力されるはずがNoneが出力されました。こちらはどのようなことが考えられますでしょうか。 よろしくお願い申し上げます。
ozwk

2021/07/13 02:59

すべてのifを通らなければやっぱりreturnがないのでNoneになってしまいます というわけで変更しました
kay_ventris4

2021/07/13 10:24

ありがとうございました!
guest

0

dfs()という関数は何を返すのでしょうか?
これを考えれば不足が分かると思います。

考えるべきことは;

  • 4方向に移動していますがその返り値を捨てています。
    本来は何かを返すはず

  • ゴールにたどり着いたときは距離を返しますが、
    ゴールにたどり着けなかったときも考えるべきです。

投稿2021/07/13 01:57

sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kay_ventris4

2021/07/13 02:07

思考の手順を示していただき、とてもわかりやすかったです。 ありがとうございました。
guest

0

ベストアンサー

dfs(x - 1, y, d + 1)

などの前にreturnがないからでしょう。

投稿2021/07/13 01:56

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kay_ventris4

2021/07/13 02:05

理解が深まりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問