You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归交换两个变量?现有递归交换代码问题咨询

问题分析与栈执行流程

你的递归swap函数根本没有执行任何交换操作——它只是在a>b时递归传递了参数,全程没修改过变量的实际值,这就是主函数里x、y毫无变化的原因。

栈执行详细流程

  1. 主函数初始化x=10、y=8,调用swap(x,y):栈上创建第一个swap栈帧,其中a是x的引用(绑定到x,当前值10),b是y的引用(绑定到y,当前值8)。
  2. 因为10>8满足条件,调用swap(b,a)——也就是把y和x作为实参传入,栈上创建第二个swap栈帧:这里的a是y的引用(值8),b是x的引用(值10)。
  3. 第二个栈帧中8>10不成立,函数直接返回(末尾隐式return),该栈帧被销毁。
  4. 回到第一个swap栈帧,swap(b,a)执行完毕后,函数无其他代码,直接返回,栈帧销毁。

整个过程中,没有任何代码修改x或y的内存值,所以主函数输出还是10 8。

可行的递归交换解决方案

递归交换本质上是用栈帧来模拟交换逻辑,但实际工程中没必要(交换是O(1)操作,递归反而增加栈开销),以下是几种用于学习的递归实现:

方案1:临时变量实现递归交换(最直观)

#include <iostream>

void swap(int &a, int &b) {
    // 终止条件:无需交换时直接返回
    if (a <= b) {
        return;
    }
    // 核心交换操作
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 10;
    int y = 8;
    swap(x, y); 
    std::cout << x << ' ' << y; // 输出 8 10
    return 0;
}

方案2:算术运算递归交换(无需临时变量)

利用加减运算实现交换,注意避免整数溢出:

void swap(int &a, int &b) {
    if (a <= b) {
        return;
    }
    a = a + b;
    b = a - b; // b变为原a的值
    a = a - b; // a变为原b的值
}

方案3:异或运算递归交换(仅适用于整数)

异或运算交换的前提是两个变量指向不同内存(避免同一变量异或自己导致值为0):

void swap(int &a, int &b) {
    // 终止条件:值相等或指向同一内存时返回
    if (a == b || &a == &b) {
        return;
    }
    a ^= b;
    b ^= a;
    a ^= b;
}

内容的提问来源于stack exchange,提问作者aslam louati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:45:33