当前位置: 首页 > 知识库问答 >
问题:

为什么递归不起作用?,其思想是,如果一个数字可以写成3次方x的和,那么它必须返回

爱唯
2023-03-14
public class Main {
public static void main(String[] args) {
    int num = 3;
    sumPower3(num);
}

private static boolean sumPower3(int num) {
    return sumPower3(num, 0);
}

private static boolean sumPower3(int num, int power) {
    if(num==0) {
        return true;
    }
    if(num<0) {
        return false;
    }
    
    return sumPower3((int)(num-Math.pow(3, power)), power+1) || sumPower3(num, power+1);
}

}

写一个递归布尔静态方法,它接受一个正整数(true)作为参数该方法应该检查这个数字是否可以写成3的幂和。每个3的幂最多可以在量中出现一次。如果数字可以这样写,该方法将返回值true,否则将返回false

共有1个答案

于鹏
2023-03-14

递归调用< code>sumPower3(num,power 1)可能会任意增加指数的值,从而导致堆栈溢出错误。为了解决这个问题,为这个参数设置一个最大值——log(num,3)——当它的值超过这个限制时终止递归。

public class Maim {
    public static void main(String[] args) {
        System.out.println(sumPower3(2296)); // true: 3^0 + 3^3 + 3^4 + 3^7 == 2296
        System.out.println(sumPower3(2297)); // false
        System.out.println(sumPower3(2298)); // true: 3^1 + 3^3 + 3^4 + 3^7 == 2298
    }

    private static boolean sumPower3(int num) {
        return sumPower3(num, 0, Math.log(num)/Math.log(3.0)); // set limit for power
    }

    private static boolean sumPower3(int num, int power, double limit) {
        if(num==0) {
            return true;
        }
        if(num<0 || power > limit) {        // check limit for power
            return false;
        }
        return sumPower3((int)(num-Math.pow(3, power)), power+1, limit) || sumPower3(num, power+1, limit);
    }
}
 类似资料:
  • 本文向大家介绍topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 可以增加 bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-co

  • 本文向大家介绍topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 不可以减少,被删除的分区数据难以处理。

  • 我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 5 6 7 8。

  • 本文向大家介绍什么是UUID?它有什么作用?用js写一个生成UUID的方法相关面试题,主要包含被问及什么是UUID?它有什么作用?用js写一个生成UUID的方法时的应答技巧和注意事项,需要的朋友参考一下 UUID含义是通用唯一识别码 (Universally Unique Identifier), 这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation,

  • 问题内容: 我在网上找到了这段代码,其中有一部分我不理解。对于doInBackground方法,传递的参数为。有人可以告诉我这是什么意思吗?那是什么 问题答案: doInBackground(String… params) // params represents a vararg. new AsyncHttpPost().execute(s1,s2,s3); // pass strings to

  • 很抱歉问了一个关于已经讨论过很多次的论点的非常基本的问题,我就是想不出答案。我试着在论坛上搜索已经在主题上提出的问题,但没有找到确切的答案(或者不理解)。 当以不同顺序调用时,为什么此函数会打印两次从i到10的数字?它不应该按同样的顺序打印出来吗?我一直听说递归就是这样工作的:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件为止。此时,它应该返回(回溯)到原始函数;这就是