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

递归中变量的使用

邢卓
2023-03-14

我写了下面的代码来反转链表的前K个节点,它在反转链表的前K个节点时解决了一些问题,为什么递归在最后一次迭代中执行两次,现在它可以正常工作,但为什么它会导致链表中的循环当我尝试在“if”条件下使用变量“k”而不是“PresCouner”时,原因是什么?以及如何避免它?

 /*
 * Condition K <= Length of linked list.
 *  node = null
 *  nextNode headNode of the linked list
 */

public void reverseNode(Node node, Node nextNode, int k) {

    int presentCounter = k;
    if (k > 1) {
        k = k - 1;
        this.reverseNode(nextNode, nextNode.next, k);
    }

    if (presentCounter == 1) {
        this.kNode = nextNode.next; // Saving K's Next Node
        this.headNode = nextNode; // Setting K node as head node
    }
    if (node == null) {
        nextNode.next = this.kNode;
    } else

        nextNode.next = node;
}

共有2个答案

子车成和
2023-03-14

当k为2时,它进入第一个条件(k

然后它会递减k并递归

但是在递归完成后,它将继续到下一行。

k=k-1给出1,因此“if(k==1)”也将在同一遍中执行该第二个条件中的操作。

通过在从presentCounter中减去1之前将k保存到presentCounter中,然后检查presentCounter==1,可以避免两次执行此额外任务(一次在递归调用中执行,因为现在k==1,一次在递归完成时执行)。

太叔永新
2023-03-14

因为如果(presenceCount==1),则稍后还会使用presentCounter检查最后一个要交换的元素
如果您天真地摆脱了k,而改用presentCounter

if (presentCounter > 1) {
    presentCounter = presentCounter - 1;
    this.reverseNode(nextNode, nextNode.next, presentCounter);
}

由于现在演示计数器已递减,因此对最后一个要交换的元素的检查会触发之前的一项。

例如,在列表中,当请求交换前三个元素时,应为c进行检查,以便进行交换。旋钮是d型的
如果前一步为true,即对于b,则此步骤为true。旋钮为c(头部设置为b)
当按相反顺序(c b a)链接元素时,旧磁头将链接到此。kNode,所以我们得到了两个不同的结果:

>

  • Corret(this. kNodeis d)
    c b a d

    不正确(this. kNode是c)
    b a c b a c...

    第二个是循环
    不过,您可以轻松摆脱k

    if (presentCounter > 1)
        this.reverseNode(nextNode, nextNode.next, presentCounter-1);
    

    为了更好的了解是怎么回事,这里放一张图。

    您必须了解有两个阶段:遍历阶段(当进行递归调用时)和构建阶段(当递归调用返回时)<因此,每次调用都会被绘制两次。

    pc代表presentCounter

    1第一个元素,当node为null时保存在nextNode中的元素,即函数的第一次调用。

  •  类似资料:
    • 对于二进制搜索树,我只能访问根节点,而我正在尝试编写一个递归方法来挖掘其左节点。 例如 root.left(); 成为 根左()。左(); 然后, 根左()。左(); 你看这是怎么回事...有没有递归的方法来更改/添加到变量中?

    • 函数甚至可以不使用局部变量来调用自己. 例子 23-14. 汉诺塔 1 #! /bin/bash 2 # 3 # 汉诺塔(The Towers Of Hanoi) 4 # Bash script 5 # Copyright (C) 2000 Amit Singh. All Rights Reserved. 6 # http://hanoi.kernelthrea

    • 我试图表示一个树状递归数据结构,其中每个节点可能是两种不同数据类型中的一种。我使用boost变体来“容纳”可能出现在每个节点上的两种类型。 但是,我遇到了一个问题。我严格使用“using”指令声明所有这些类型,因此当我到达节点的递归性质时,它会失败,因为typedef/using可能不会使用递归。 如何做到这一点? 我已经探索过使用boost::make_recursive_variant,但它创

    • 即使不适用局部变量,函数也可以递归的调用自身。 例子24-16. 斐波那契序列 #!/bin/bash # fibo.sh : 斐波那契序列 (递归) # 作者: M. Cooper # License: GPL3 # ----------算法-------------- # Fibo(0) = 0 # Fibo(1) = 1 # else # Fibo(j) = Fibo(j-1) + Fi

    • 我使用递归方法在二叉树中使用键查找节点。找到节点后,我将其设置为引用变量foundNode并返回。问题是,当我读取对象时,它的值仍然是null。有人能帮忙吗?

    • 为了使Playbook更灵活、通用性更强,允许用户在执行的时候传入变量的值,这个时候就需要用到“额外变量”。 定义命令行变量 在release.yml文件里,hosts和user都定义为变量,需要从命令行传递变量值。 --- - hosts: '{{ hosts }}' remote_user: '{{ user }}' tasks: - ... 使用命令行变量 在命令行里面传值