C++ 嵌套与递归(第三章)

目录

函数的嵌套调用

嵌套调用

例3-7 输入两个整数,求平方和

函数的递归调用

定义

例:计算n!

例如,计算4!的两个阶段:

例3-8 求n!

源代码:

运行结果:

例 3-9 用递归法计算从 n 个人中选选 k 个人组成一个委员会的不同组合数。

 分析

源代码:

运行结果:

例3-10汉诺塔

源代码:

运行结果:

函数的参数传递


函数的嵌套调用

嵌套调用

例3-7 输入两个整数,求平方和

#include <iostream>
using namespace std;
int fun2(int m) {
    return m * m;
}
int fun1(int x,int y) {
    return fun2(x) + fun2(y);
}
int main() {
    int a, b;
    cout<<"Please enter two integers (a and b): ";
    cin >> a >> b;
    cout << "The sum of square of a and  b: " 
         << fun1(a, b) << endl;
    return 0;
}

函数的递归调用

定义

l   函数直接或间接地调用自身,称为递归调用。

 

例:计算n!

l  公式1:n!=n×(n-1)×(n-2)×(n-3)×...×2×1.

l  公式2:

 

例如,计算4!的两个阶段:

l  递推:

l  回归:

例3-8 求n!

 

源代码:

#include <iostream>
using namespace std;
unsigned fac(int n){
    unsigned f;
    if (n == 0)
      f = 1;
    else
      f = fac(n - 1) * n;
    return f;
}
int main() {
    unsigned n;
    cout << "Enter a positive integer:";
    cin >> n;
    unsigned y = fac(n);
    cout << n << "! = " << y << endl;
    return 0;
}


运行结果:

Enter a positive integer:8
8! = 40320

例 3-9 用递归法计算从 n 个人中选选 k 个人组成一个委员会的不同组合数。

 分析

         由 n 个人里选 k 个人的组合数= 由 n-1 个人里选 k 个人的组合数+由 n-1 个人里 选 k-1 个人的组合数;

         当 n = k 或 k = 0 时,组合数为 1。

源代码:

#include<iostream>
using namespace std;
int comm(int n, int k)
{
	if (k > n) return 0;
	else if (n == k || k == 0)
		return 1;
	else return comm(n - 1, k) + comm(n - 1, k - 1);
}
int main()
{
	int n, k;
	cin >> n >> k;
	cout << "C(n, k) = " << comm(n, k) << endl;
	return 0;
}

运行结果:

18 5 
8568

例3-10汉诺塔

l  有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。

l  将n 个盘子从A针移到C针可以分解为三个步骤:

n  将A 上n-1个盘子移到 B针上(借助C针);

n  把A针上剩下的一个盘子移到C针上;

n  将n-1个盘子从B针移到C针上(借助A针)。

源代码:

#include <iostream>
using namespace std;

//将src针的最上面一个盘子移动到dest针上
void move(char src, char dest) {
    cout << src << " --> " << dest << endl;
}

//将n个盘子从src针移动到dest针,以medium针作为中转
void hanoi(int n, char src, char medium, char dest)
{
    if (n == 1)
        move(src, dest);
    else {
        hanoi(n - 1, src, dest, medium);
        move(src, dest);
        hanoi(n - 1, medium, src, dest);
    }
}
int main() {
    int m;
    cout << "Enter the number of diskes: ";
    cin >> m;
    cout << "the steps to moving " << m << " diskes:" << endl;
    hanoi(m, 'A', 'B', 'C');
    return 0;
}

运行结果:

Enter the number of diskes:3
the steps to moving 3 diskes:
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

函数的参数传递

  • 在函数被调用时才分配形参的存储单元
  • 实参可以是常量、变量或表达式
  • 实参类型必须与形参相符
  • 值传递是传递参数值,即单向传递
  • 引用传递可以实现双向传递
  • 常引用作参数可以保障实参数据的安全

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值