递归函数及其R实现

点击下方图片查看HappyChart专业绘图软件

HappyChart专业绘图软件

今天看了几个递归的小例子,觉得不错,自己就试着写了两个。先看看
斐波那契数列:

 fibs <- function(n){
     if(n==1 | n==2){
         return(1)
     }
     else{
         return(fibs(n-1)+fibs(n-2))
     }
 }
 fibs(6) ##得到8

打印前20个:

 for(i in 1:20){
     print(fibs(i))
 }

[1] 1
[1] 1
[1] 2
[1] 3
[1] 5
[1] 8
[1] 13
[1] 21
[1] 34
[1] 55
[1] 89
[1] 144
[1] 233
[1] 377
[1] 610
[1] 987
[1] 1597
[1] 2584
[1] 4181
[1] 6765
阶乘函数:

fac <- function(n){
     if(n==0){
         return(1)
     }
     else{
         return(n*fac(n-1))
     }
 }
 fac(5) ##结果为120

排序算法:

a = c(3,1,4,7,2,5)
sorted <- function(a){
  if(length(a)==1){
    return(a)
    break
  }
  b = a[which.min(a)]
  a[which.min(a)] = a[1]
  a[1] = b
  return(c(a[1],sorted(a[-1]))) ##递归
}
sorted(a)

[1] 1 2 3 4 5 7

翻转序列:

char <- c('a','b','c','d')
rec_char <- function(x){
       if (length(x)==1) return(x)
       return(c(tail(x,1),rec_char(x[-length(x)])))
}
rec_char(char)

[1] “d” “c” “b” “a”

### C++ 中递归函数的终止条件及其实现方法 #### 终止条件的重要性 在 C++ 的递归函数设计中,**终止条件**是一个至关重要的部分。如果缺少有效的终止条件,递归将会无休止地执行下去,最终导致栈溢出等问题[^2]。 #### 如何设置终止条件 通常情况下,终止条件会作为递归函数中的一个分支逻辑存在。它用于判断当前输入参数是否满足停止递归的标准。一旦满足该标准,则直接返回特定的结果而不再继续调用自身。 以下是几个常见的例子: 1. **计算阶乘** 下面展示了一个简单的阶乘函数 `factorial`,其中设置了当 `n == 1` 或 `n == 0` 时的终止条件。 ```cpp int factorial(int n) { if (n == 0 || n == 1) { // 设置终止条件 return 1; } return n * factorial(n - 1); } ``` 2. **求解斐波那契数列** 斐波那契数列可以通过递归实现,在此过程中也需要定义两个基本情况作为终止条件。 ```cpp int fibonacci(int n) { if (n == 0) { // 第一种终止条件 return 0; } if (n == 1) { // 第二种终止条件 return 1; } return fibonacci(n - 1) + fibonacci(n - 2); } ``` 3. **汉诺塔问题** 对于经典的 Hanoi 塔问题,其递归结构同样依赖于明确的终止条件——即移动单个盘子的情况。 ```cpp void hanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) { // 当只有一个盘子时,直接完成转移操作 cout << "Move disk 1 from rod " << from_rod << " to rod " << to_rod << endl; return; } hanoi(n - 1, from_rod, aux_rod, to_rod); // 将前 n-1 个盘子移到辅助柱上 cout << "Move disk " << n << " from rod " << from_rod << " to rod " << to_rod << endl; hanoi(n - 1, aux_rod, to_rod, from_rod); // 将剩下的盘子从辅助柱移至目标柱 } ``` 4. **全排列生成** 使用递归可以方便地解决许多组合数学上的难题,例如生成数组的所有可能排列。这里展示了如何利用终止条件控制递归流程。 ```cpp template<class T> void permute(T a[], int l, int r) { if (l == r) { // 如果左边界等于右边界,则打印当前排列 for (int i = 0; i <= r; ++i) cout << a[i] << ' '; cout << '\n'; } else { for (int i = l; i <= r; ++i) { swap(a[l], a[i]); // 交换位置 permute(a, l + 1, r); // 处理下一个元素 swap(a[l], a[i]); // 恢复原始状态以便下一轮迭代 } } } ``` 以上各例均体现了合理设定终止条件对于成功构建递归算法的关键作用。无论是简单运算还是复杂数据处理场景,都需谨慎考虑何时以及怎样退出递归链条以保障程序正常运行[^3]。 #### 总结 为了防止无限循环或者不必要的资源消耗,任何递归方案的设计都需要包含清晰界定好的出口策略。这不仅有助于提高代码可读性和维护效率,还能有效规避潜在风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值