プロが教える店舗&オフィスのセキュリティ対策術

こんにちは
再帰処理を用いて階乗を求めるプログラムについて
の質問です。
以下のように考えたのですが、
まったく駄目なようです。
どこをどのように直したらいいのか
いまいちわかりません。
どなたか教えて下さい。お願いします。

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

A 回答 (7件)

再帰処理の場合、蛇が自分の尻尾を呑んでいるようなプログラムになります。


ご質問はループ処理であって、再帰になっていないと思います。
下記に再帰関数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
    • good
    • 0
この回答へのお礼

お礼が遅れ申し訳ありませんでした。
ご回答ありがとうございました。
お陰様で何がわからなかったのか
理解することができました。

お礼日時:2003/10/10 12:36

KEISAN = n * KEISAN(n - 1)



↑が再帰してる部分かと思います(^^;
    • good
    • 0

>拝見したところ、自分自身を呼び出しているし、十分再帰処理かと思うのですが…



KEISAN()が再帰対象の関数だと思いますが、
この関数の中でKEISAN()を呼び出しているようには見えませんけど・・・

>ちなみに、ByRefでも問題なく再帰できますよ。
そうですね。目的によるでしょう。
ちょっと言葉足らずでしたね。
今回のケースはByValの方が効率的かと思います。
    • good
    • 1

>自分自身を呼び出していませんから、再帰とは言えないのではないでしょうか。



ん? 拝見したところ、自分自身を呼び出しているし、十分再帰処理かと思うのですが…

ちなみに、ByRefでも問題なく再帰できますよ。
例えば、サブフォルダに含まれるファイルの一覧を再帰検索を行うとすると、フォルダを一階層降りるごとに大量のテキストデータが発生します。これを一々ByValで渡したりしてたら埒が明きません。
こんな時は文字列の配列を作って、引数の中で参照渡しした方がはるかに効率がいいんですよね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2003/10/10 12:39

再帰処理とは自分自身を呼び出すことです。


この場合KEISANが演算処理だと思いますが、
自分自身を呼び出していませんから、再帰とは言えないのではないでしょうか。

演習として再帰に取り組んでおられるのでなければ、
VB上での階乗の標記は
x^n (ex. 2の3乗は 2^3)
で表現できますが。

再帰とするなら、
パラメータにByVal(値渡し)を付け、計算結果を関数の戻り値としょう。
ByValを省略すると、ByRef(参照渡し)となってしまいます。
    • good
    • 0
この回答へのお礼

値渡しと参照渡しは勉強不足でした。
ためになります。ありがとうございました。

お礼日時:2003/10/10 12:38

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で再帰ができないのは初めて知りました。勉強になりました。
# 私の環境では上記で問題なく動くのですが、何か見落としているのでしょうか・・・?
    • good
    • 0
この回答へのお礼

お礼が遅れ申し訳ありませんでした。
アドバイスありがとうございました。
今回は再帰処理の勉強であったため、
再帰処理で階乗計算を行うプログラムの作成でした。

お礼日時:2003/10/10 12:34

残念ですがVBでは再帰処理は出来ないはずですが。


再帰処理ができる条件は同じ関数の中で1つの変数の世代管理ができることです。
VBにはこの機能がありません。

再帰処理を使わずに単に階乗を計算することなら出来ますが。
    • good
    • 0
この回答へのお礼

お礼が遅れ申し訳ありませんでした。
ご回答ありがとうございました。
今回は再帰処理の勉強であったため、
あえて再帰処理を用いたプログラムでした。

お礼日時:2003/10/10 12:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!