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

关于《算法导论》伪代码传值约定及相关概念的技术问询

嘿,咱们一步步把《算法导论》里这个参数传递的约定掰明白哈~

关于伪代码参数传递约定的详细解释

1. 什么是「调用过程」?

简单说,就是主动发起函数/过程调用的那个代码块。比如你写了个主逻辑Main(),里面调用了CalculateSum(arr),那Main()就是调用过程,CalculateSum(arr)是被调用过程。类比一下:你(调用过程)喊朋友(被调用过程)帮忙算账单,你是发起请求的那个,朋友是执行任务的那个。

2. 「对调用过程可见/不可见」是什么意思?

  • 不可见:被调用过程对参数做的修改,调用过程完全感知不到——就像你朋友帮你算账单时,在自己的草稿纸上改了数字,但你手里的原始账单一点没变。
  • 可见:被调用过程对参数的修改,调用过程能直接看到变化——就像朋友帮你把账单里的某笔金额改了,你拿起自己的账单就能发现这个变化。

3. 拆解《算法导论》里的约定内容

咱们把原文分成两种核心场景来看:

场景1:普通参数的按值传递

参数按值传递给过程:被调用过程会收到参数的副本,若其对参数赋值,该变化对调用过程不可见。

举个伪代码例子直观理解:

// 调用过程
Main() {
    num = 10
    Print(num)  // 输出:10
    UpdateNum(num)
    Print(num)  // 还是输出:10,修改对调用过程不可见
}

// 被调用过程
UpdateNum(x) {
    x = 20  // 这里修改的是x的副本,和Main里的num完全是两个独立的变量
}

这里被调用过程拿到的是参数的“复印件”,改复印件根本影响不到原件,所以调用过程看不到任何变化。

场景2:对象(带指针/引用的结构)的传递

传递对象时,仅复制指向对象数据的指针,而非对象的字段。例如,若x是被调用过程的参数,在被调用过程中执行x ← y的赋值操作,该变化对调用过程不可见;但执行f[x] ← 3的赋值操作则是可见的。

还是用伪代码举例:

// 调用过程
Main() {
    arr = [1, 2, 3]  // 这是一个数组对象,背后有个指针指向存储[1,2,3]的内存区域
    Print(arr)  // 输出:[1,2,3]
    ModifyArray(arr)
    Print(arr)  // 输出:[1,2,3, 99],这个修改是可见的
}

// 被调用过程
ModifyArray(x) {
    // 第一种操作:x ← y,修改的是指针副本
    new_arr = [4,5,6]
    x = new_arr  // 这里把x(指针的副本)指向了新数组,但Main里的arr还是指向原来的[1,2,3],所以Main看不到这个变化
    
    // 第二种操作:x[3] ←99,修改的是对象本身的内容
    x.append(99)  // 顺着指针副本找到原来的数组内存,直接修改了里面的内容,Main里的arr自然能看到变化
}

简单总结:传递对象时,被调用过程拿到的是“指向原件的地址复印件”:

  • 如果你直接把这个地址换成另一个对象(x ← y),只是复印件上的地址变了,原件的地址没动,调用过程看不到;
  • 但如果你顺着这个地址去修改原件里的内容(比如x[index] ← 值),原件本身被改了,调用过程肯定能看到变化。

内容的提问来源于stack exchange,提问作者Jake Wright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:32:44