こんにちは
再帰処理を用いて階乗を求めるプログラムについて
の質問です。
以下のように考えたのですが、
まったく駄目なようです。
どこをどのように直したらいいのか
いまいちわかりません。
どなたか教えて下さい。お願いします。
Private Sub CommandButton1_Click()
Dim n As Integer 階乗する数
Dim f As Integer 階乗する数の階乗した値
n = Val(TextBox1)
Do While f > 1
KEISAN n, f
Loop
TextBox2 = f
End Function
Function KEISAN(n, f)
If n <= 1 Then
f = 1
Else
f = n * f(n - 1)
End If
End Function
No.2ベストアンサー
- 回答日時:
再帰処理の場合、蛇が自分の尻尾を呑んでいるようなプログラムになります。
ご質問はループ処理であって、再帰になっていないと思います。
下記に再帰関数KEISANのサンプルを示します。
一応実行して確認しました。
Private Sub CommandButton1_Click()
Dim n As Integer
n = Val(TextBox1)
TextBox2 = KEISAN(n)
End Function
Private Function KEISAN(n)
If n <= 1 Then
KEISAN = 1
Else
KEISAN = n * KEISAN(n - 1)
End If
End Function
No.6
- 回答日時:
>拝見したところ、自分自身を呼び出しているし、十分再帰処理かと思うのですが…
KEISAN()が再帰対象の関数だと思いますが、
この関数の中でKEISAN()を呼び出しているようには見えませんけど・・・
>ちなみに、ByRefでも問題なく再帰できますよ。
そうですね。目的によるでしょう。
ちょっと言葉足らずでしたね。
今回のケースはByValの方が効率的かと思います。
No.5
- 回答日時:
>自分自身を呼び出していませんから、再帰とは言えないのではないでしょうか。
ん? 拝見したところ、自分自身を呼び出しているし、十分再帰処理かと思うのですが…
ちなみに、ByRefでも問題なく再帰できますよ。
例えば、サブフォルダに含まれるファイルの一覧を再帰検索を行うとすると、フォルダを一階層降りるごとに大量のテキストデータが発生します。これを一々ByValで渡したりしてたら埒が明きません。
こんな時は文字列の配列を作って、引数の中で参照渡しした方がはるかに効率がいいんですよね。
No.4
- 回答日時:
再帰処理とは自分自身を呼び出すことです。
この場合KEISANが演算処理だと思いますが、
自分自身を呼び出していませんから、再帰とは言えないのではないでしょうか。
演習として再帰に取り組んでおられるのでなければ、
VB上での階乗の標記は
x^n (ex. 2の3乗は 2^3)
で表現できますが。
再帰とするなら、
パラメータにByVal(値渡し)を付け、計算結果を関数の戻り値としょう。
ByValを省略すると、ByRef(参照渡し)となってしまいます。
No.3
- 回答日時:
Private Sub CommandButton1_Click()
Dim n As Long
Dim f As Long
n = CLng(TextBox1.Text)
TextBox2.Text = CStr(Recur(n))
End Sub
Public Function Recur(ByVal arg As Long) As Long
If arg = 1 Then
Recur = arg
Exit Function
End If
Recur = arg * Recur(arg - 1)
End Function
↑こんな感じでできるようです。
でも、階乗計算を再帰で実現する必要性が理解できません。(笑)
(For ループでこと足りるので)
# VBで再帰ができないのは初めて知りました。勉強になりました。
# 私の環境では上記で問題なく動くのですが、何か見落としているのでしょうか・・・?
お礼が遅れ申し訳ありませんでした。
アドバイスありがとうございました。
今回は再帰処理の勉強であったため、
再帰処理で階乗計算を行うプログラムの作成でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 時刻差分の算出方法
-
c言語。 組み合わせ最適化問題...
-
DoEvents関数って何?
-
再帰処理を用いて階乗を求める...
-
Excelでのセル内容の高速消去方法
-
ナップザック問題?をエクセル...
-
win10で、正確な待ち時間の作り方
-
絶対パスの取得について
-
Excel VBAにて、2GB超の点群デ...
-
この問題が解けません( iдi )
-
基本情報技術者試験詳しい方へ...
-
プログラム上のCPU稼働率低減に...
-
wavelet変換のソフト
-
WindowsMessage(ウィンドウメッ...
-
C# プログレスバーに関すること
-
If Not c Is Nothing Then ~延...
-
緯度、経度の 10進法と 60進法...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
プロダクションコードとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
小数点を含む数値かどうか判断...
-
Chat GPTに、課題として、二と...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
実行時のCPU使用率を増やしたい
-
プログラム上のCPU稼働率低減に...
-
ノットイコールを教えて下さい
-
C言語:関数を使うメリットとデ...
-
Excel(VBA)でSetTimer関数を使...
-
あっち向いてホイのプログラム...
-
VC++2010 GDIオブジェクトの解...
-
If Not c Is Nothing Then ~延...
-
Excel VBA での処理時間計測結...
-
符号付きにすべきか、符号なし...
-
ソートにかかった時間を測りたい。
-
プログラミングの授業でPython...
おすすめ情報