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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

2回答

1745閲覧

関数の呼び出しについて

kaeruuuun

総合スコア19

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2021/06/15 02:14

編集2021/06/19 04:37

python初心者です.

python

1T = "aaannn$" 2SA = suffixA(T) 3LCP = lcpA(T, SA) 4LCPstar = StarA(LCP)

このようにして与えたTに対して求めたLCPstarを最終的に表示します(表示部分までは載せていません).
この時関数StarAの中のsptという関数が上の与えたTの場合何回呼び出されるかを数えたいです.
関数はこのように別で定義しています.

python

1def StarA(LCP): 2 lcpstr={} 3 v, lcpstr=spt(0,len(LCP)-1, LCP, lcpstr) 4 return lcpstr

いくつか方法を調べてみたのですが.

例えばリンク内容
のグローバル変数を使った場合

python

1g = 0 2def spt(): 3 global g 4 g += 1 5 print(g) 6

のようになると思うのですが,これをどこに置くのが良いのかわかりません.よろしくお願いいたします.

追記

python

1 2def spt(L,R,LCP,lcpstar,cnt=[0]): 3 cnt[0] += 1 4 print(str(cnt[0]) + "回目の呼び出し") 5 if R-L > 1: 6 M = int((L+R)/2) 7 vL, lcpstar = spt(L, M, LCP, lcpstar) 8 vR, lcpstar = spt(M, R, LCP, lcpstar) 9 v = min(vL, vR) 10 elif R-L == 1: 11 v = LCP[L] 12 13 lcpstar[tuple([L,R])] = v 14 lcpstar[tuple([R,L])] = v 15 return v, lcpstar

上から2行目と3行目を追加したらこのように数えられているような気がするのですが,更新がされず
1回目に実行すると

1回目の呼び出し
2回目の呼び出し
3回目の呼び出し
4回目の呼び出し
5回目の呼び出し
6回目の呼び出し
7回目の呼び出し
8回目の呼び出し
9回目の呼び出し
10回目の呼び出し
11回目の呼び出し

2回目に実行すると
12回目の呼び出し
13回目の呼び出し
14回目の呼び出し
15回目の呼び出し
16回目の呼び出し
17回目の呼び出し
18回目の呼び出し
19回目の呼び出し
20回目の呼び出し
21回目の呼び出し
22回目の呼び出し
カウントが更新されず,続きからになります.どのように直したらいいですが?

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

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

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

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

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

guest

回答2

0

ベストアンサー

どこにおいてもだめでしょう。

StarA(LCP)の呼び出しより後に置けば回数を数えることはできません。
StarA(LCP)より前に置けば実行時エラーになります。

もしも、関数sptが再帰呼び出しをしていなければ、StarAの呼び出し一回について、関数sptは一回呼び出されているので、数える必要はないのではないでしょうか。

再帰呼び出しの場合はいろいろな方法があります。
追加されたコードをなるべく活かすなら以下です。

python

1def spt(L,R,LCP,lcpstar,cnt=[0], reset=False): 2 if reset: 3 cnt[0] = 0 4 cnt[0] += 1 5 print(str(cnt[0]) + "回目の呼び出し") 6 if R-L > 1: 7 M = int((L+R)/2) 8 vL, lcpstar = spt(L, M, LCP, lcpstar) 9 vR, lcpstar = spt(M, R, LCP, lcpstar) 10 v = min(vL, vR) 11 elif R-L == 1: 12 v = LCP[L] 13 14 lcpstar[tuple([L,R])] = v 15 lcpstar[tuple([R,L])] = v 16 return v, lcpstar 17 18def StarA(LCP): 19 lcpstr={} 20 v, lcpstr=spt(0,len(LCP)-1, LCP, lcpstr, reset=True) 21 return lcpstr

投稿2021/06/15 03:26

編集2021/06/15 06:14
ppaul

総合スコア24670

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

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

kaeruuuun

2021/06/15 05:37 編集

ご回答ありがとうございます. 追記を書きましたのでよろしければみていただきたいです.
kaeruuuun

2021/06/15 07:47

追記を見ていただきましてありがとうございます. カウントが毎回リセットできるようになりました. 可能であればこのプログラムに関してreset=Falseやreset=Trueを追加することでなぜリセットできるようになったか説明いだだけますでしょうか.
ppaul

2021/06/15 09:22

StarAからの呼び出しでは、引数にreset=Trueを指定しているので、 if reset: cnt[0] = 0 でcnt[0]がゼロになる、つまりリセットされます。 sptの中で再帰的に呼び出す場合は、resetに相当する引数がないため、resetの省略値としてFalseが使われるので if reset: cnt[0] = 0 は通らないのでリセットされません。
guest

0

数えたい、という関数に書きましょう

投稿2021/06/15 02:21

y_waiwai

総合スコア88042

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

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

kaeruuuun

2021/06/15 02:29 編集

回答ありがとうございます. sptの関数の中に g = 0 def spt(): global g g += 1 print(g) を置いた場合, T = "aaannn$" SA = suffixA(T) LCP = lcpA(T, SA) LCPstar = StarA(LCP)の後に この関数を呼び出す必要はありますか?
y_waiwai

2021/06/15 02:31

def StarA(LCP): のあとにspt()を置きましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問