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

n选择Java中的k递归问题

冉弘化
2023-03-14

我是Java新手,正在尝试用Java编写n choose k。然而,我遇到了一个问题。

public class App {
public static void main(String[] args) throws Exception {
    int n = 3;
    int k = 2;
    int result = combRecursion(n, k);
    System.out.println(result);
}

private static int combRecursion(int n, int k) {
    if (k == 0) {
        return 1;
    } else {
        return (combRecursion(n - 1, k - 1) + combRecursion(n - 1, k));
    }
}

输出:这方面的许多迭代:

        at App.combRecursion(App.java:14)

如果有人能帮忙,我将不胜感激。

共有2个答案

堵浩波
2023-03-14

在递归方法中,您已经编写了k参数,它将决定结束递归的基本情况。

基本case只检查ks值,右递归调用继续进行递归调用,其中k保持不变,其嵌套的递归调用反过来也会做同样的事情,无休止地生成右递归调用

那个递归调用给你一个StackOverflow Error

您应该将其改写为:

int choose(int n, int k) {
    if (k == 0) return 1;
    return (n * choose(n - 1, k - 1)) / k;
}
戎桐
2023-03-14

您的基本情况应该包括n==k | | k==0,以便正确实现“n选择k”。这样,两个调用最终都会终止(即使您当前的实现效率很低,因为它具有指数运行时)。更好的实现应该使用公式n/k/(n-k) 或在线性时间内运行的乘法公式:

int factorial(int n) {
    int res = 1;
    for (; n > 1; n--) {
        res *= n;
    }
    return res
}
int choose(int n, int k) {
    return factorial(n)/factorial(k)/factorial(n-k);
}

进一步优化这是留给读者的练习(提示:单个for循环就足够了)。

 类似资料:
  • 给定一个数组大小n和一个正数max(max表示我们可以用来放置在数组中的数字范围)。 我想计算我可以在数组中放置多少个排序数字的组合。 例如: 如果n=3,则最大值为2。(我们只能使用1/2的数字,因为最大值是2)因此有4种排序数组组合 我编写了一些代码,并成功地通过了这个特定的示例,但任何其他示例 我发现的问题是,当递归到达最后一个索引时,它不会尝试第三个数字,而是向后折叠。 我的代码:

  • 问题内容: 我具有以下表结构: 因此,每个论坛帖子都有一个父母,也有一个父母(根帖子除外),等等。我需要的是获取一个论坛帖子所拥有的孩子总数,包括他的孩子的孩子,孙子的孩子等等。 现在,我有一个简单的选择返回直接子代: 我什至不确定这是否可以通过sql来实现,但是我是SQL的入门者,因此我认为也许有人可以提出一些想法。 任何帮助表示赞赏。谢谢。 问题答案: 这应该做到这一点: 您可以通过修改条件来

  • 问题内容: 我有一个问题,就是无法解决。我知道我想要的,只是无法在屏幕上显示出来。我有一张桌子,看起来像这样: ParentId具有FK到ID。 我要完成的工作是获取我传递的ID下方所有ID的完整列表。 例子: 这棵树看起来像这样: 如果我现在要求4,我将只得到4,但是如果我要求1,我将得到1、2、3和5。如果我要求2,我将得到2和3,依此类推。 有谁能指出我正确的方向。我的大脑炸了,所以我感谢我

  • 我一直在寻找一个递归选择排序,只使用2个参数: 必须排序的数组 一个值k,它指示要对哪个元素进行排序。 示例:a为{6,3,5,7,2}且k为2的SelectionSort(array[]a,int k)将对前3个元素进行排序,并保持最后的元素不变。 我想从一个if语句开始,k为0,如果是这样的话,它就会按原样返回数组,因为您不能对大小为1的数组进行排序。类似于: 我不知道如何做'else'部分,

  • 问题内容: 我看到了这个答案,我希望他是不对的,就像有人不正确地告诉主键在一个列上,而我不能在多个列上设置它一样。 这是我的桌子 我想选择用户ID 2并递归,以便获得其所有直接子对象和间接子对象(即ID 4和5)。 如何以这种方式工作?我在postgresql和sqlserver中看到了递归。 问题答案: 看起来很麻烦,但是要使用它, (或您要在层次树中查找的任何密钥ID)。 前提是从您正在使用的

  • 问题内容: 这是情况。我有两个表: 用户(网站的注册用户), 消息(彼此之间发送的个人消息) 消息表具有以下列(仅是重要的列): ID, 发件人(发送消息的用户的ID), 发送消息的用户的接收者ID), reply_to(此消息要回复到的消息的ID,可以为NULL) 我需要做的是构造一个SELECT查询,该查询将选择2个用户之间的完整对话。即,如果用户A回复了从用户B发送的消息,而用户B回复了该消