java中的递归方法记忆化

2024-03-08

我正在做家庭作业,我已经筋疲力尽了。我是编程新手,这是我的第一堂编程课。

这就是问题:

考虑 Collat​​z.java 中的以下递归函数,它与数论中一个著名的未解决问题(称为 Collat​​z 问题或 3n + 1 问题)相关。

public static void collatz(int n) {
StdOut.print(n + " ");
if (n == 1) return;
if (n % 2 == 0) collatz(n / 2);
else            collatz(3*n + 1);}

例如,调用 collat​​z(7) 会打印序列 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 17 次递归调用的结果。编写一个程序,该程序采用命令行参数 N 并返回 n

我尝试了几件事:使用 for 循环,尝试使用每次执行方法时递增的变量来计算执行次数,以及数小时的苦差事。

显然,我应该以某种方式使用数组来进行记忆。但是,我不明白当必须在启动时指定数组的长度时如何使用数组。

我做错了什么吗?我误解了这个问题吗?

到目前为止,这是我的代码。它反映了尝试创建整数数组的尝试:

public class Collatz2 {
public static int collatz2(int n)
{

    StdOut.print(n + " ");
    if (n==1) {return 1;}
    else if (n==2) {return 1;}
    else if (n%2==0) {return collatz2(n/2);}
    else {return collatz2(3*n+1);}

}



public static void main(String[] args)
{
    int N = Integer.parseInt(args[0]);
    StdOut.println(collatz2(N));

}
}

EDIT:

我写了一个单独的程序

public class Count {
   public static void main(String[] args) { 
        int count = 0;       

        while (!StdIn.isEmpty()) {
            int value = StdIn.readInt();
            count++;
        }

        StdOut.println("count is " + count);
    }
}

然后我使用了管道: %java Collat​​z2 6 | java 计数

而且效果很好。


由于您感兴趣的是最大序列大小,而不一定是序列本身,因此最好让 collat​​z 返回序列的大小。

private static final Map<Integer,Integer> previousResults = new HashMap<>();

private static int collatz(int n) {
    int result = 1;
    if(previousResults.containsKey(n)) {
        return previousResults.get(n);
    } else {
        if(n==1) result = 1;
        else if(n%2==0) result += collatz(n/2);
        else result += collatz(3*n + 1);
        previousResults.put(n, result);
        return result;
    }
}

记忆化是通过在 Map previousResults 中存储 n 的先前值的序列大小来实现的。

您可以在主函数中查找最大值:

public static void main(String[] args) {
    int N = Integer.parseInt(args[0]);
    int maxn=0, maxSize=0;
    for(int n=N; n>0; n--) {
        int size = collatz(n);
        if(size>maxSize) {
            maxn = n;
            maxSize = size;
        }
    }
    System.out.println(maxn + " - " + maxSize);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的递归方法记忆化 的相关文章

随机推荐

  • 是否可以/推荐发送包含 Javascript 的 HTML 电子邮件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android Studio 中的 NDK 集成

    今天我将android studio更新到1 3 并在local properties中输入NDK android ndk r10e NDK版本 路径 ndk dir C AndroidNDK android ndk r10e androi
  • 在 AngularJs 中制作工厂模块的正确方法

    我有一个像这样的控制器功能 scope localTimezone function userTimezone datetime return data 使其成为工厂模块的正确方法是什么 我尝试了以下操作 但出现错误 angular mod
  • 已完成百分比的流

    我需要使用类似的方法将 base64 格式的文件流式传输到 http 端点request https github com mikeal request or 超级代理人 https github com visionmedia super
  • 如何将 UISearchController 搜索栏设置为不是 tableHeaderView 或 navigationItem.titleview 的视图?

    我试图在表格滚动时保持搜索栏可见 目前 我将其作为表视图中的标题 并且它按应有的方式工作 但是当然 当您沿着表格向下滚动时 搜索栏会滚动到屏幕之外 我想我可以简单地修改这个代码示例来做到这一点 如何在 iOS 8 中使用 UISearchC
  • Keycloak - 如何检查用户名和电子邮件是否存在

    我们希望以编程方式创建 Keycloak 用户 并检查用户名和 或电子邮件地址是否已存在于 Keycloak 中 我们正在使用的版本4 4 0 FINAL 当我们使用 Keycloak 管理客户端以编程方式创建用户时 如果用户名或电子邮件地
  • Laravel 路线带我去别的地方

    我正在尝试通过 Laravel 和 vue js 创建 CRUD 应用程序 但这里总是存在问题 当我运行该应用程序时 它会转到仪表板并且不会出现 CRUD 操作 以下是 Routes web app 代码
  • 基于 int 创建多个编号变量

    我将如何创建多个NSDictionary使用数组计数的变量 这基本上是我想到的 但我不确定如何使用 Objective C 语法来实现它 doesntContainAnother is an NSArray 我希望字典的名称使用当前值loo
  • CMD脚本:如何关闭CMD

    我创建了一个小命令 可以让我启动 Internet Explorer 但是 我希望关闭启动 IE 时显示的小命令提示符 我怎样才能做到这一点 这是我当前的代码 ProgramFiles Internet Explorer iexplore
  • 未知协议:c(JDOM 和 SAXBuilder)

    我正在使用 JDOM 和 SAXBuilder 来解析 XML 文件 但我遇到了一个抛出此错误的文件问题 java net MalformedURLException unknown protocol c at java net URL
  • Shell 命令适用于命令行,但不适用于 PHP exec

    我有一个命令 当直接在命令行上运行时 它可以按预期工作 它运行超过 30 秒并且没有抛出任何错误 当通过 PHP 函数 exec 包含在由 cron 调用的脚本中 通过 PHP 脚本调用相同的命令时 它会抛出以下错误 最长执行时间为 30
  • Windows 下以 cygwin 和 Github 结尾的行

    我希望能够使用 Windows 应用程序的 Github 以及使用 Cygwin 在 Windows 上 的命令行中的 git 来处理我的 git 项目 但当我从一种切换到另一种时 我不断遇到行尾问题 如果使用命令行工具存储库没有更改 它将
  • 如何模拟从不同模块导入的方法中导入的函数[重复]

    这个问题在这里已经有答案了 我有以下功能要测试 my package db engine db functions py from utils import execute cmd from my package db engine db
  • 使用jquery获取facebox div内元素的值

    我的页面上有两个 div 标签 如下所示 当我引用 itemName 元素的值时 使用 itemName val 我在两个 div 中都有 我总是得到第一个 div 中元素的值 即 空白 有没有办法使用 jquery 获取第二个 div 中
  • 在所有地址上运行我自己的用户脚本有风险吗?

    Tampermonkey 对于大多数浏览器 和 Greasemonkey 对于 Firefox 都支持 match and include指令 当我开始阅读它们之间的区别时 结果发现 match有点严格 用户脚本不会在某些地址上启动 这可能
  • 如何获得具有固定总和和大小的随机数列表

    如何根据给定大小和期望总和获取随机数列表 完全支持 i hava a code sum int ts https github com bluelovers random blob master src distributions sum
  • IronPython 3 兼容性

    我喜欢Python语言 主要使用标准CPython 3 版本来进行简单的脚本编写和作为算法沙箱 有时我需要 NET集成 所以我使用IronPython 它现在是2 7版本 我更喜欢 3 因此不愿意使用旧的 2 7 有没有关于何时发布以及迁移
  • kusto now() 函数在单个查询中返回相同的值

    我正在尝试检测 kusto 函数的一部分来检查不同场景下的执行时间 但是我找不到打印前后时间的方法 print now
  • Heroku 上的 Django 与 PostgreSQL 应用程序不同步

    我正在尝试按照以下教程在 Heroku 上运行 Django Heroku 上的 Django 入门 https devcenter heroku com articles django 一切都运行良好 直到我到达syncbd部分 同步数据
  • java中的递归方法记忆化

    我正在做家庭作业 我已经筋疲力尽了 我是编程新手 这是我的第一堂编程课 这就是问题 考虑 Collat z java 中的以下递归函数 它与数论中一个著名的未解决问题 称为 Collat z 问题或 3n 1 问题 相关 public st