Delphi 函数的 out 形参

文章讨论了Delphi编程中关于函数参数(如`out`参数)的使用,以及如何正确处理变量赋值。重点提及了字符类型转换,如从ASCII码到字符的转换。
// 以上会输出Hello,因为方法ChangeS其实是创建了一个新的A,
// 而输出的还是原来的s,值并没有改变
var
  s: string;

const
  PI = 3.14;

function ChangeSVar(out A: string): string;   //只加out  以上会输出World,
//out仅仅接受返回的值,对out的任何输入都会被忽略。同时out传递给过程的实际参数不必进行初始化,
begin
  A := A + 'World';
end;

begin
  //s := 'Hello '; 可不初始化
  ChangeSVar(s);
  writeln(s);
  //PI := 5;   //    [dcc32 Error] T001.dpr(18): E2064 Left side cannot be assigned to
  //char是个数据类型,char()
  //这个格式是把一个别的数据类型强转成char类型,
  //比如,char(97)和 char(#97)都将得到a。
  writeln(char(#97)); //把字符转成 char

  writeln(chr(12)); //把数字转成 char


  writeln(chr(12));
  // chr是个函数,参数是byte类型,
  // 负责把ascii码值转换成char,比如:chr(97)返回一个char类型’a’;
  readln;

end.

<think> 我们正在讨论递归函数形参。递归函数是指在函数体内调用自身的函数形参(形式参数)是函数定义时声明的变量,用于接收调用时传递的实参(实际参数)。在递归函数中,形参的设计尤为重要,因为它决定了每次递归调用时传递的信息。 递归函数形参的关键点: 1. **基本参数**:通常用于传递递归过程中需要处理的数据,例如数组、当前深度、索引等。 2. **递归终止参数**:有时需要传递一个参数作为递归终止条件判断的依据,例如当深度达到某个阈值或索引超出范围。 3. **可变状态参数**:在递归过程中可能需要累积结果或传递状态,这些状态可以通过形参传递(注意:有时使用返回值传递状态更合适,取决于设计)。 使用递归形参的注意事项: - 每次递归调用都会创建新的形参变量(位于不同的调用栈上),因此不会相互覆盖(除非使用全局变量或可变对象的引用修改)。 - 合理设计形参可以避免不必要的全局变量使用,使函数更纯粹(无副作用)。 - 对于深层递归,注意形参过多或过大可能导致栈溢出。 示例1:阶乘函数 阶乘函数通常只需要一个参数n。 定义:$n! = n \times (n-1)!$,且$0!=1$。 代码: ```python def factorial(n): if n == 0: return 1 return n * factorial(n-1) ``` 这里形参n在每次递归调用时减1,直到0为止。 示例2:斐波那契数列 斐波那契数列:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n>=2) ```python def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) ``` 注意:这个递归实现效率较低,因为存在大量重复计算,通常我们会用记忆化或迭代来优化。 示例3:带累积参数的递归(尾递归) 例如,我们想计算阶乘,但希望用尾递归的形式(虽然Python并不优化尾递归,但作为一种设计思路): ```python def factorial_tail(n, acc=1): if n == 0: return acc return factorial_tail(n-1, n*acc) ``` 这里我们引入了一个累积参数`acc`,用来保存中间结果。这样在递归调用时,计算已经在参数中完成,理论上可以被优化为迭代(尾递归优化)。 使用场景: 递归函数形参设计取决于问题本身。通常,我们会根据递归过程中需要传递的信息来设计形参。例如: - 遍历树结构时,可能需要传递当前节点,有时还需要传递深度或路径信息。 - 在分治算法中,我们通常传递待处理的子问题和一些边界索引。 注意事项: 1. 递归终止条件必须依赖于形参(或全局状态,但尽量避免)。 2. 形参过多会使函数签名复杂,可以考虑将多个参数封装成对象(或使用结构体、字典等)。 3. 注意递归深度,避免栈溢出。 相关问题: 1. 递归函数形参和普通函数形参有什么区别? 2. 如何避免递归函数形参传递导致的性能问题? 3. 递归函数中如何使用引用类型的形参(如数组)? 4. 尾递归优化在哪些编程语言中被支持?它是如何工作的? </think> ### 递归函数形参的介绍与使用 递归函数形参(形式参数)是函数定义时声明的变量,用于接收调用时传递的实参(实际参数)。它们在递归过程中扮演着关键角色,主要有以下特点: #### 核心特点 1. **独立作用域** 每次递归调用都会创建独立的参数副本,不同递归层级的形参互不影响(除非使用引用类型)[^1]。 例如:`int func(int n)` 中,每一层的 `n` 都是独立变量 2. **状态传递** 形参是递归状态的载体,负责向下传递计算状态 示例: ```python def factorial(n, acc=1): # acc 是累积参数 if n == 0: return acc return factorial(n-1, n*acc) # 向下传递新状态 ``` 3. **终止条件判定** 形参值通常用于判断递归终止条件 例如:`if n <= 1: return n` #### 关键使用技巧 1. **基础参数设计** ```python # 求和函数 def sum_list(lst, index=0): if index >= len(lst): return 0 return lst[index] + sum_list(lst, index+1) # index 控制递归深度 ``` 2. **累积参数优化** 避免重复计算,减少栈空间使用: ```python # 尾递归优化版斐波那契 def fib(n, a=0, b=1): if n == 0: return a return fib(n-1, b, a+b) # 累积结果通过参数传递 ``` 3. **引用型参数处理** 当操作共享数据结构时: ```python # 反转链表(原地修改) def reverse_list(node, prev=None): if not node: return prev next_node = node.next node.next = prev return reverse_list(next_node, node) # 传递修改后的节点 ``` #### 注意事项 1. **栈溢出风险** 深度递归时优先选用尾递归形式(累积参数方案) 2. **默认参数陷阱** 避免使用可变对象作为默认值: ```python # 错误示例(所有调用共享同一列表) def traverse(node, path=[]): ... # 正确写法 def traverse(node, path=None): path = path or [] ``` 3. **类型一致性** 递归各层应保持参数类型一致,例如: ```c // C语言示例 int binary_search(int arr[], int low, int high, int target) { if (low > high) return -1; int mid = (low + high)/2; if(arr[mid] == target) return mid; if(arr[mid] > target) return binary_search(arr, low, mid-1, target); return binary_search(arr, mid+1, high, target); } ``` #### 典型应用场景 1. 树/图遍历(传递当前节点) 2. 分治算法(传递子问题范围) 3. 状态空间搜索(传递路径/状态) 4. 数学递归定义实现(如斐波那契、阶乘) [^1]: 函数调用栈会为每次递归创建独立的栈帧,包含独立的参数副本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值