私は、ZFC 集合論、特にコンピュータ プログラムが無限公理をモデル化して自然数を「構築」する方法をよりよく理解しようとしています。自然数を構成するために使用される典型的な記号は、「{」、「}」、および「,」です。
以下のコードは機能しますが、純粋に再帰的なソリューションを望んでいます。自然数 (ここでは int を使用) を指定すると、対応する文字列を集合論的エンコーディングに再帰的に構築し、それを返します。理想的には、現在使用されている String 配列のような余分なデータ構造を使用せずに機能することを願っています。
ランタイムが遅い (指数関数的) 場合は問題ありません。再帰を使用すると、プロセスの表現がより単純で、より凝縮/エレガントになり、理解しやすくなることがあります。パフォーマンスに関係なく、このような解決策がどのように見えるかを非常に知りたいです。最終的には、数学/数の基礎をよりよく理解したいと思います。たくさんの質問がありますが、これは始めるのに良い方法かもしれないと思いました. ありがとう!
// Converts an natural number to its ZFC set notation:
// 0 = {}, 1 = {0} = {{}}, 2 = {0,1} = {{},{{}}},
// 3 = {0,1,2} = {{},{{}},{{},{{}}}} ...
import java.util.Scanner;
public class IntToSetNotation {
private static final String openBrace = "{";
private static final String closeBrace = "}";
private static final String seperator = ",";
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.println(getSetNotationFromInt(n));
}
private static String getSetNotationFromInt(int n) {
String[] nums = new String[n+1];
nums[0] = openBrace + closeBrace;
for (int i = 1; i < nums.length; i++) {
if(i == nums.length-1)
nums[i] = openBrace + getPrevSets(i,nums) + closeBrace;
else
nums[i] = seperator + openBrace + getPrevSets(i,nums) + closeBrace;
}
return nums[n];
}
private static String getPrevSets(int n, String[] nums) {
String s = "";
for (int i = 0; i<n; i++)
s += nums[i];
return s;
}
}