关于《算法导论》伪代码传值约定及相关概念的技术问询
嘿,咱们一步步把《算法导论》里这个参数传递的约定掰明白哈~
关于伪代码参数传递约定的详细解释
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
相关产品推荐
相关产品推荐

