【iPhone】再帰ショートカット(?)で階乗を計算する
更新情報
2020/08/01
「繰り返しインデックス」と繰り返し回数の表を見やすい形に修正しました
ショートカットを実行アクション を使って階乗の計算をやってみる回
これ自体に実用性はないんだよな。面白いんだけどね
テキトーにやるとマジであぶねえので、試すときは自己責任で
注意点
ここで紹介していることを使うと、無限ループ(のようなもの)を簡単に作ることができます。しかし、作り方をミスると、いつまで経っても処理が終わらない危険なショートカットを作成・実行してしまう形になり、その結果として、ショートカットのデータベース(保存しているショートカット)を壊してしまう可能性があります。
そのため、この記事に書いてあることをやる場合には、iCloud同期がオンになっていることを確認してから行うようにしてください。
追記 2020/06/22
iCloud同期でオートメーションは保護できないので、注意。オートメーションに処理を直書きするのはやめたほうがいいかもしれません。オートメーションで行う処理はショートカットで作り、オートメーション中でショートカットを実行アクション を使って呼び出す形にした方が、データベースが壊れた時の復元が楽になるかと思います。
1. はじめに
まず、普通に(計算アクションを使って)階乗の計算をやります。繰り返すアクション と組み合わせて、簡単な階乗表みたいなものを出力するようなショートカットを作成します。
階乗表 と 実行結果
「繰り返しインデックス」というのは、ショートカットの繰り返すアクションに用意されている特殊な変数です。この変数は、今が何回目のループなのかということを指し示す役割を持ち、繰り返すアクションの内部でのみ使用することができるようになっています。
例えば、上のショートカットでは、10回繰り返し処理が行われます。このとき、各繰り返し処理での「繰り返しインデックス」の値は、以下のようになっています。
繰り返し回数 |「繰り返しインデックス」の値
1回目 → 1
2回目 → 2
3回目 → 3
4回目 → 4
5回目 → 5
6回目 → 6
7回目 → 7
8回目 → 8
9回目 → 9
10回目 → 10
今が何回目の繰り返しなのかということと、「繰り返しインデックス」の値が、対応しているのがわかるかと思います。
繰り返すアクションの内部では、「繰り返しインデックス」の値の階乗値を計算したあと、テキストアクションで式の形式に整形し、それを「繰り返しの終了」アクションに渡しています。例えば、5回目の繰り返しのときには、以下の数式(テキスト)が、「繰り返しの終了」アクションに渡されることになります。
5! = 120
繰り返しが終了した後、結果を改行で結合するということを行っていますが、これは繰り返すアクション全体の結果が、繰り返しの終了アクション に渡された全てのコンテンツのリストになっているためです。
このことは、以下の記事で触れていますので、よければ参照してやってください。
実行結果のプレビューからコピーしてきた実行結果も以下に載せておきます。
実行結果
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
2. ショートカットを実行アクション
ショートカットには、すでに作成済みの他のショートカットを呼び出すことができる ショートカットを実行アクション が存在します。
このアクションを使うことで、自分で作成したショートカットを、あたかもショートカットAppに初めから用意されているアクションのようにして使うことができるようになります。例えば、以下のようにして使います。
「階乗表」を呼び出す
上の使用例では、先程作成した「階乗表」ショートカットを呼び出し、その出力を「結果を表示」アクションに渡して、結果を表示させています。
言い方を変えると、「1〜10までの階乗表を出力する」アクション(ショートカット) を自作し、それを利用したということになるかと思います。
このように見方を変えて見てみると、ショートカットを作成するということは、アクションを自作していると考えることもできるのです。
勿論、他のアクションと同様に、なんらかの入力値を渡して実行させることも可能になっています。
3. 自分自身を呼び出す[再帰]
ショートカットを実行アクション では、自分自身を呼び出すこともできるようになっています。
例えば、以下は連続して単語を調べることができる辞書ショートカットのレシピですが、レシピ内で自分自身(shortcutDictionary) を呼び出すということを行っています。
shortcutDictionary
上のショートカットでは、単語を調べた後、自分自身(shortcutDictionary) を呼び出すことで、連続して単語を調べることができるようになっています。
このように、自分自身を用いて定義が行われているときに、それは 再帰的(recursive) であるなんていわれたりします。
タイトルの 再帰ショートカット っていう言葉の意味は、そういうことです。実際そんな言葉はない(テキトーにくっつけただけやし)と思うのですが、まあそこは雰囲気で...ね。
4. 階乗を計算するアクションを作る
ようやっと、本題です。ショートカットを実行アクション を使って、階乗を計算するショートカット(アクション)を作成します。
非負の整数nの階乗は、以下のように再帰的に定義できます。(階乗の定義の中で、階乗の定義を呼び出すかたちになっています)
0! = 1
n! = n * (n - 1)! (n > 0)
なので、上の定義をそのままショートカットのレシピとして再現してやればいいことになります。
そうすると、レシピは以下のようなものになります。レシピ中で 自分自身(factorial) を呼び出している点に注意してください。
※ factorialは、階乗という意味の英単語です
factorial
ショートカットを作成したら、先程の階乗表ショートカットで、計算アクションを使っていたところを、factorialに入れ替えて、実行してみることにします。
階乗表2 と 実行結果2
実行結果のプレビューからコピーしてきたものを以下に貼り付けておきます。ちゃんと計算できていることがわかります。
実行結果2
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
5. まとめ
今回は、ショートカットを実行アクション を使って、階乗の計算を行ってみました。
あと実際のところ、ショートカットで無限ループを欲する機会なんてあんまないでしょうし、繰り返すアクションの定数回ループがあるだけで十分ですよね...。
わざわざ危険を犯す必要はないと思います。
では〜
6. おまけ
c言語で書いたやつを載せておきます。
factorial.c
#include <stdio.h>
int factorial(int n)
{
if(n <= 0) return 1;
return n * factorial(n - 1);
}
int main(void)
{
int n = 0;
printf("n: ");
scanf("%d", &n);
printf("%d!=%d\n", n, factorial(n));
return 0;
}