初心者のFileMaker pro Q&A

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

ログインしていません。

アナウンス

Claris FileMaker Pro ヘルプ
新しい質問は、新規トピック から投稿して下さい。


#1 2023-09-12 08:44:38

すぎほ
ゲストユーザー

[解決] letを用いた計算式での階乗の実装

letの勉強を兼ねて、計算式で階乗を実装しようと思ったのですがなかなかうまくいきません。間違いを指摘いただけると幸いです。
下記はn=3として3の階乗を求めようとしているものです。

// 階乗
Let (
[
$n = 3 ;
$ans = 1;
$saiki = "


Case(

$n > 1;
Let (
[
$ans = $ans * $n ; $n = $n - 1
] ;
evaluate($saiki);

$n = 1;
$ans

)


"
];

Evaluate ( $saiki )

)

#2 2023-09-12 09:51:58

himadanee
ゲストユーザー

Re: [解決] letを用いた計算式での階乗の実装

再帰をしたいなら、LetよりWhileかカスタム関数を勉強した方がいいですよ。
Evaluteを使った再帰はWhileがなかったころの苦肉の策です。(Whileより効率がいいケースもあった気がしますが)

$saikiの中のLetの使い方が間違ってますね。[]のあとは結果を計算する式を1つしか書けません。

#3 2023-09-12 10:07:04

Shin
メンバー

Re: [解決] letを用いた計算式での階乗の実装

環境は?
括弧の位置や関係がおかしいですね。インデントを入れて、見易いように整形すると、あとで楽です。

Let(
[
	$n = 3 ;
	$res = 1 ;
 	$rec = 
		"Case ( 
			$n = 1 ; $res ;
			Let(
			[
				$res = $res * $n ;
				$n = $n - 1 
			] ; 
				Evaluate ( $rec )
			)
		)"
] ;
	Evaluate ( $rec )
)
While ( 
[ 
	$n = 3 ;
	$res = $n 
] ; 
	$n > 1 ; 
[ 
	$n = $n - 1 ;
	$res = $res * $n 
] ; 
	$res 
)

編集者 Shin (2023-09-12 12:16:13)

オフライン

#4 2023-09-12 10:16:28

チポ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

二番目のLet関数の「)」閉じかっこがありませんよ

オフライン

#5 2023-09-13 17:08:19

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

チポ さんの発言:

二番目のLet関数の「)」閉じかっこがありませんよ

の通りでした。

みなさま、ありがとうございました。

環境がpro advance 17ということもあり、whileが使えませんでした。
再帰の勉強にはなったかなと思います。

また今まではfilemaker内で計算式を作っていましたが、
今後は自動インデント付きの環境で行うことにします。

追記
これはfor文での階乗の実装かと思われますが、再帰関数で実現したく現在はそちらの勉強をしています。

編集者 すぎほ (2023-09-13 17:10:19)

オフライン

#6 2023-09-13 17:15:22

Shin
メンバー

Re: [解決] letを用いた計算式での階乗の実装

自動インデンとは、なかなか使いにくいですよ。上の式は、手動でインデンと入れています。

オフライン

#7 2023-09-14 09:50:45

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

すぎほ さんの発言:

追記
これはfor文での階乗の実装かと思われますが、再帰関数で実現したく現在はそちらの勉強をしています。

以下の通りになりました。みなさまありがとうございました。

let(
    [
        $n = 5;
        $saiki = case(
            $n = 1;
            1;

            $n > 1;
            let(
                [
                    $n = $n -1 
                ];
                ($n + 1) * evaluate($saiki)
            )
            
        )
    ];
    evaluate($saiki)
)

オフライン

#8 2023-09-14 09:57:07

himadanee
ゲストユーザー

Re: [解決] letを用いた計算式での階乗の実装

"が2か所抜けてますね。

""の中の改行は実際には半角スペースとみなされるので、場合によっては要注意です。

#9 2023-09-14 10:19:36

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

himadanee さんの発言:

"が2か所抜けてますね。

""の中の改行は実際には半角スペースとみなされるので、場合によっては要注意です。


二つ目の計算式の話ですかね? どこかわからずすみません。

> ""の中の改行は実際には半角スペースとみなされるので、場合によっては要注意です。
知らなかったです、ありがとうございます。

オフライン

#10 2023-09-14 10:23:30

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

計算式を""で囲わなきゃいけない、ということですかね?

オフライン

#11 2023-09-14 10:32:27

himadanee
ゲストユーザー

Re: [解決] letを用いた計算式での階乗の実装

Advancedならデータビューアはありますよね。フィールドを使ってない計算式なのでそこにコピペしてみればすぐに動作確認できますよ。

$saiki =
で代入するCase関数はEvaluateするためのものなので""の中に入れる必要があります。

#12 2023-09-14 10:39:15

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

データビューア、知らなかったです。使ってみますありがとうございます。

""について、入れなくてもなぜか動いてしまったのですが、こういう時が一番厄介ですね、気を付けます。

オフライン

#13 2023-09-14 10:52:25

Shin
メンバー

Re: [解決] letを用いた計算式での階乗の実装

> ""について、入れなくてもなぜか動いてしまった
"" 無いと、結果がおかしいですよ。

Case() の中の、8行目は、除外されたデフォルト条件になるので、省略してもいいです。

編集者 Shin (2023-09-14 10:53:45)

オフライン

#14 2023-09-14 13:32:08

すぎほ
メンバー

Re: [解決] letを用いた計算式での階乗の実装

失礼しました。もう一度実行してみたところ、おかしな挙動になりました。
自分の勘違いでした。

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

オフライン

クィック投稿

メッセージを書いて送信してください。
登録の確認

実在の人物による登録であることを確認します。

Board footer