Collatz

タグ:

コラッツ数列を求め結果を配列で返します。

構文
  1. Array = Collatz( num )
引数
num
コラッツ数列の初期値
戻値

プログラム

//////////////////////////////////////////////////
// 【引数】
//   num : コラッツ数列の初期値 
// 【戻値】
//   
//////////////////////////////////////////////////
FUNCTION Collatz(num)
	IFB !reTest(num, "\d+") THEN
		RESULT = ERR_VALUE
		EXIT
	ENDIF
	DIM array[-1]
	arrayPush(array, num)
	WHILE num <> 1
		num = IIF(num MOD 2 = 0, num / 2, num * 3 + 1)
		arrayPush(array, num)
	WEND
	RESULT = SLICE(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現にマッチするかどうか 
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Test(str)
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND

プログラム実行例

コラッツ数列を出力

DIM arr = Collatz(11)

FOR item IN arr
	PRINT item
NEXT

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   num : コラッツ数列の初期値 
// 【戻値】
//   
//////////////////////////////////////////////////
FUNCTION Collatz(num)
	IFB !reTest(num, "\d+") THEN
		RESULT = ERR_VALUE
		EXIT
	ENDIF
	DIM array[-1]
	arrayPush(array, num)
	WHILE num <> 1
		num = IIF(num MOD 2 = 0, num / 2, num * 3 + 1)
		arrayPush(array, num)
	WEND
	RESULT = SLICE(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現にマッチするかどうか 
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Test(str)
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
    (1)
結果
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

関連記事

ABS (スクリプト関数)
引数の絶対値(\(|x|\))を返します。
ARCCOS (スクリプト関数)
引数の 逆余弦 を求めます。
ARCSIN (スクリプト関数)
引数の 逆正弦 を求めます。
ARCTAN (スクリプト関数)
引数の 逆正接 を求めます。
CEIL (スクリプト関数)
正の値へ切り上げた数値を返します。
EXP (スクリプト関数)
自然指数関数(\(y=e^{x}\))を求める。
LN (スクリプト関数)
自然対数(\(\log_e{x}\))を求める。
LOGN (スクリプト関数)
Baseを底とするXの対数(\(\log_{Base}{x}\))を求める。
ZCUT (スクリプト関数)
マイナス値は0にして返します。
INT (スクリプト関数)
小数点以下を切り落とした数値を返します。
POWER (スクリプト関数)
数値のべき乗(\(\small{Base}^{Exponent}\))を求めます。
RANDOM (スクリプト関数)
ランダムな値を返します。
ROUND (スクリプト関数)
指定した位置で偶数丸めした値を返します。
isEven (自作関数)
引数に指定した数値が偶数かどうかを調べます。偶数ならばTrue、それ以外の数値はFalse、文字列はエラー値を返します。
isOdd (自作関数)
引数に指定した数値が奇数かどうかを調べます。奇数ならばTrue、それ以外の数値はFalse、文字列はエラー値を返します。
radToDeg (自作関数)
弧度法(Radian)を度数法(Degree)に変換します。度数法を弧度法に変換するにはDegToRad関数を使います。
SQRT (スクリプト関数)
平方根(\(\sqrt{x}\))を求める。
fact (自作関数)
引数に指定した自然数の階乗を求めます。再帰関数。二重階乗を求めるにはfactDouble関数を使います。
factDouble (自作関数)
引数に指定した自然数の二重階乗を求めます。戻値の型はDouble型です。再帰関数。階乗を求めるにはfact関数を使います。
degToRad (自作関数)
度数法(Degree)を弧度法(Radian)に変換します。弧度法を度数法に変換するにはRadToDeg関数を使います。
GCD (自作関数)
GCD関数は、引数に指定した配列の最大公約数(Greatest Common Measure)を求める関数です。最小公倍数を求めるには、LCM関数を使います。
LCM (自作関数)
LCM関数は、引数に指定した配列の最小公倍数(Least Common Multiple)を求める関数です。最大公約数を求めるには、GMD関数を使います。
hexToDec (自作関数)
16進数を10進数に変換します。10進数を16進数に変換するにはdecToHex関数を使います。
decToHex (自作関数)
10進数を16進数に変換します。16進数を10進数に変換するにはhexToDec関数を使います。
binToDec (自作関数)
2進数を10進数に変換します。10進数を2進数に変換するにはdecToBin関数を使います。
binToHex (自作関数)
2進数を16進数に変換します。16進数を2進数に変換するにはhexToBin関数を使います。
hexToBin (自作関数)
16進数を2進数に変換します。2進数を16進数に変換するにはbinToHex関数を使います。
decToBin (自作関数)
10進数を2進数に変換します。2進数を10進数に変換するにはbinToDec関数を使います。
isPrime (自作関数)
引数に指定した数値が素数かどうかを調べます。素数の場合True、素数でない場合Falseを返します。
normalizeAngle (自作関数)
度単位の角度を0~360度に正規化します。
divisors (自作関数)
引数に指定した数値の約数をリストを配列で返します。
digitSum (自作関数)
引数に指定した数字和(数値の各桁を足した結果)を返します。正の整数以外を指定した場合は、エラー値を返します。
Kaprekar (自作関数)
カプレカ数を求め結果を配列で返します。
ARABIC (自作関数)
ARABIC関数は、ローマ数字をアラビア数字に変換する関数です。アラビア数字をローマ数字に変換するには、ROMAN関数を使います。
ROMAN (自作関数)
ROMAN関数は、アラビア数字をローマ数字に変換する関数です。ローマ数字をアラビア数字に変換するには、ARABIC関数を使います。