初心者のFileMaker pro Q&A (旧掲示板)

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

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

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


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

すぎほ
Guest

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
Guest

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

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

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

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

Shin
Member

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 
)

Last edited by Shin (2023-09-12 12:16:13)

Offline

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

チポ
Member

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

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

Offline

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

すぎほ
Member

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

チポ wrote:

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

の通りでした。

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

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

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

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

Last edited by すぎほ (2023-09-13 17:10:19)

Offline

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

Shin
Member

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

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

Offline

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

すぎほ
Member

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

すぎほ wrote:

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

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

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

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

Offline

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

himadanee
Guest

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

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

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

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

すぎほ
Member

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

himadanee wrote:

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

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


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

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

Offline

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

すぎほ
Member

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

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

Offline

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

himadanee
Guest

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

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

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

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

すぎほ
Member

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

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

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

Offline

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

Shin
Member

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

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

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

Last edited by Shin (2023-09-14 10:53:45)

Offline

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

すぎほ
Member

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

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

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

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 566.99 KiB (Peak: 583.53 KiB) ]