Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个Java程序使用迭代将自然数转换为集合论编码。请求递归解决方案的帮助/策略?_Java_Recursion_Number Theory_Set Theory_Peano Numbers - Fatal编程技术网

这个Java程序使用迭代将自然数转换为集合论编码。请求递归解决方案的帮助/策略?

这个Java程序使用迭代将自然数转换为集合论编码。请求递归解决方案的帮助/策略?,java,recursion,number-theory,set-theory,peano-numbers,Java,Recursion,Number Theory,Set Theory,Peano Numbers,我试图更好地理解ZFC集合论,特别是计算机程序如何对无限公理进行建模以“构造”自然数。我见过的用于构造自然数的典型符号是:“{”、“}”和“,”下面的代码可以工作,但我希望有一个纯粹的递归解决方案。给定一个自然数(这里使用int),递归地将相应的字符串构建到其集合论编码中,然后返回它。理想情况下,我希望它能够在不使用任何额外数据结构(如当前使用的字符串数组)的情况下工作。如果运行时很慢(指数级),则可以。使用递归有时会使流程的表达式更简单、更简洁/优雅、更容易理解,我非常希望看到这样的解决方案会

我试图更好地理解ZFC集合论,特别是计算机程序如何对无限公理进行建模以“构造”自然数。我见过的用于构造自然数的典型符号是:“{”、“}”和“,”

下面的代码可以工作,但我希望有一个纯粹的递归解决方案。给定一个自然数(这里使用int),递归地将相应的字符串构建到其集合论编码中,然后返回它。理想情况下,我希望它能够在不使用任何额外数据结构(如当前使用的字符串数组)的情况下工作。

如果运行时很慢(指数级),则可以。使用递归有时会使流程的表达式更简单、更简洁/优雅、更容易理解,我非常希望看到这样的解决方案会是什么样子,而不管性能如何。最后,我想更好地理解数学/数字的基础。我有很多问题,但我认为这可能是一个好的开始。谢谢

// 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;
    }
} 
//将自然数转换为其ZFC集合表示法:
// 0 = {}, 1 = {0} = {{}}, 2 = {0,1} = {{},{{}}},  
// 3 = {0,1,2} = {{},{{}},{{},{{}}}} ...    
导入java.util.Scanner;
公共类IntToSetNotation{
私有静态最终字符串openBrace=“{”;
私有静态最终字符串closeBrace=“}”;
专用静态最终字符串分隔符=“,”;
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
int n=input.nextInt();
System.out.println(getSetNotationFromInt(n));
}
私有静态字符串getSetNotationFromInt(int n){
字符串[]nums=新字符串[n+1];
nums[0]=openBrace+closeBrace;
对于(int i=1;i对于(inti=0;i,递归听起来非常困难,但一旦你忘记了这个名字,它实际上有点简单

递归需要做很多事情:一个基本情况来停止递归,一个输出来做你想做的事情

假设您要编写一个递归问题,该问题包含一个数字x,并返回一个特定的花括号模式:

0==(无)

1=={}

2=={{}

3=={{}}

因此,递归方法将取一个整数

现在,让我们看看方法输出。如果我们在1上调用递归方法,我们希望返回{}.Easy。对于java,我们将返回一个字符串

很好,现在我们知道了方法的返回类型

如果我们在2上调用recursive method,我们希望该方法首先输出{},然后我们希望该方法再次执行,但这一次,我们在开始处放置一个卷曲,在结束处放置一个卷曲

这是很难解释的部分。将递归想象成一个循环。最终,我们希望递归终止。假设我们最初在3上调用该方法。我们希望返回{{}}。首先,我们的方法将返回{},然后是{{},然后是{{}。它总共运行3次

在递归调用中,必须比初始调用少调用一次

好,现在你说,如果我们每次减去1,然后再次调用这个方法,我们如何让它停止

如果方法是在0上调用的,我们不想返回任何东西,因此我们想用一个简单的return语句退出方法

把这个应用到你自己的问题上,你应该表现得很好

String exampleRecursiveMethod(int x){
 if(x==0)return "";
 else return exampleRecursiveMethod(x-1)
}

这是一个让您开始学习的示例。else之后的return语句被称为递归调用,我在上面讨论过它。

我提出了下面的代码作为递归解决方案。它是有效的,但我想知道是否有任何方法可以简化它,或者使用更少的方法?欢迎任何想法或评论

public class IntToSetNotationRecursive {
    private static final String openBrace = "{";
    private static final String closeBrace = "}";
    private static final String seperator = ",";

    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            System.out.println(i + " = " + getSetNotationFromInt(i));
        }
    }

    static String getSetNotationFromInt(int n){
        return helper1(n, n, "");
    }

    static String helper1(int n, int x, String s){
        if(x<=0)
            return openBrace + s + closeBrace;

        return helper1(n, x-1, helper2(x-1) + ((x != n ) ? seperator : "") + s);
    }

    static String helper2(int x){
        if(x<=0)return openBrace+closeBrace;
        else return helper1(x, x, "");
    }
}
公共类IntToSetNotationRecursive{
私有静态最终字符串openBrace=“{”;
私有静态最终字符串closeBrace=“}”;
专用静态最终字符串分隔符=“,”;
公共静态void main(字符串[]args){
对于(int i=0;i<6;i++){
System.out.println(i+“=”+getSetNotationFromInt(i));
}
}
静态字符串getSetNotationFromInt(int n){
返回helper1(n,n,“”);
}
静态字符串帮助器1(整数n、整数x、字符串s){

如果(x第二个助手方法是不必要的。这里是一个简短的版本

public class IntToSetNotationRecursive {
    private static final String openBrace = "{";
    private static final String closeBrace = "}";
    private static final String separator = ",";

    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            System.out.println(i + " = " + getSetNotationFromInt(i));
        }
    }

    static String getSetNotationFromInt(int n){
        return helper1(n, n, "");
    }

    static String helper1(int n, int x, String s){
        if(x<=0)
            return openBrace + s + closeBrace;

        return helper1(n, x-1, helper1(x-1,x-1,"") + ((x != n ) ? separator : "") + s);
    }
}
公共类IntToSetNotationRecursive{
私有静态最终字符串openBrace=“{”;
私有静态最终字符串closeBrace=“}”;
专用静态最终字符串分隔符=“,”;
公共静态void main(字符串[]args){
对于(int i=0;i<6;i++){
System.out.println(i+“=”+getSetNotationFromInt(i));
}
}
静态字符串getSetNotationFromInt(int n){
返回helper1(n,n,“”);
}
静态字符串帮助器1(整数n、整数x、字符串s){

if(xI)我投票结束这个问题,因为stackoverflow.com不是一个免费的编码服务。@patrickhule19谢谢,很好的提示。但是棘手的部分是从3->{{}}到3->{{},{},{},{},{},{},{}},很难看到如何让递归以这种方式构建字符串。