1. 程式人生 > >第3章 函式 (2)

第3章 函式 (2)

文章目錄

一、巢狀與遞迴

1、函式的巢狀

巢狀呼叫

2、函式的遞迴呼叫

定義:函式直接或者間接地呼叫自身。

例題1:計算n的階乘

在這裡插入圖片描述

#include <iostream>
using namespace std; unsigned factorial(unsigned n) { if (n == 0) return 1; return n * factorial(n - 1); } int main() { cout << factorial(5)<<endl; }

例題2:用遞迴法計算從n個人中選k個人組成一個委員會的不同組合數。

分析

  • 由n個人裡選k個人的組合數= 由n-1個人裡選k個人的組合數+由n-1個人裡選k-1個人的組合數;
  • 當n = k或k = 0時,組合數為1。

C

n k = C n 1 k + C n 1 k 1 C_n^k=C_{n-1}^k+C_{n-1}^{k-1}

#include <iostream>
using namespace std;

unsigned combination(unsigned n, unsigned k) {
	unsigned results;
	if (k > n)
		results = 0;
	else if	(n == k || k == 0)
		results = 1;
	else
		results = combination(n - 1, k) + combination(n - 1, k - 1);
	return results;
}

int main() {
	int n, k;
	cout << "please enter n and k: " << endl;
	cin >> n >> k;
	cout << "C(n,k)="<<combination(n,k) << endl;
	return 0;
}

例題3 漢諾塔

在這裡插入圖片描述

#include <iostream>
using namespace std;

void move(char src, char dest) {
	cout << src << " ----> " << dest << endl;
}

void hanoi(int m, char src, char medium, char dest) {
	//m: 盤子個數  src:源 dest: 目的地  medium: 中介
	if (m == 1) {
		move(src, dest);
	}
	else {
		hanoi(m - 1, src, dest, medium);
		move(src, dest);
		hanoi(m - 1, medium, src, dest);
	}

}

int main() {
	hanoi(10, 'A', 'B', 'C');
}

二、函式的引數傳遞

在這裡插入圖片描述

1、引用型別

在這裡插入圖片描述

例題1: 值傳遞,交換

#include <iostream>
using namespace std;
void swap(int a, int b) {
	int t;
	t = a;
	a = b;
	b = t;
}

int main() {
	int x = 4, y = 5;
	cout << "x = " << x << "  y = " << y << endl;
	swap(x, y);
	cout << "x = " << x << "  y = " << y << endl;
	return 0;
}

在這裡插入圖片描述

例題2:引用傳遞,交換

#include <iostream>
using namespace std;

void swap(int &a, int &b) {
	int t;
	t = a;
	a = b;
	b = t;
}

int main() {
	int x = 4, y = 5;
	cout << "x = " << x << "  y = " << y << endl;
	swap(x, y);
	cout << "x = " << x << "  y = " << y << endl;
	return 0;
}

在這裡插入圖片描述

三、含有可變引數的函式

含有可變引數的函式

在這裡插入圖片描述

initializer_list提供的操作

在這裡插入圖片描述

initializer_list使用方法

在這裡插入圖片描述

四、行內函數

在這裡插入圖片描述在這裡插入圖片描述

例題:行內函數應用舉例

#include <iostream>
using namespace std;

const double PI = 3.1415926;
inline double calArea(double r) {
	return PI * r*r;
}

int main() {
	double r = 3.0;
	double area = calArea(r);
	cout << area << endl;
	return 0;
}

五、constexpr函式

在這裡插入圖片描述

六、帶預設引數值的函式

預設引數值

可以預先設定預設的引數值,呼叫時如給出實參,則採用實參值,否則採用預先設定的預設引數值。

例:

int add(int x = 5,int y = 6) {
     return x + y;
}

int main() {
     add(10,20);  //10+20
     add(10);     //10+6
     add();       //5+6
}

預設引數值的說明次序

  • 有預設引數的形參必須列在形參列表的最右,即預設引數值的右面不能有無預設值的引數;
  • 呼叫時實參與形參的結合次序是從左向右。

例:

int add(int x, int y = 5, int z = 6);//正確
int add(int x = 1, int y = 5, int z);//錯誤
int add(int x = 1, int y, int z = 6);//錯誤

預設引數值與函式的呼叫位置

  • 如果一個函式有原型宣告,且原型宣告在定義之前,則預設引數值應在函式原型宣告中給出;如果只有函式的定義,或函式定義在前,則預設引數值可以函式定義中給出。

例:
在這裡插入圖片描述

例題:計算長方體體積

函式getVolume計算體積
有三個形參:length(長)、width(寬)、height(高),其中width和height帶有預設值2和3。
主函式中以不同形式呼叫getVolume函式。

#include <iostream>
#include <iomanip>
using namespace std;

int getVolume(int length, int width = 2, int height = 3);
int main() {
	const int X = 10, Y = 12, Z = 15;
	cout << "Some box data is " ;
	cout << getVolume(X, Y, Z) << endl;
	cout << "Some box data is " ;
	cout << getVolume(X, Y) << endl;
	cout << "Some box data is " ;
	cout << getVolume(X) << endl;
	return 0;
}


int getVolume(int length, int width, int height) {
	cout << setw(5) << length << setw(5) << width << setw(5) 
	<< height << '\t';
	return length * width * height;
}

七、函式過載

函式過載的概念

在這裡插入圖片描述

例題:過載函式應用舉例

#include <iostream>
using namespace std;

int sumOfSquare(int a, int b) {
	return a * a + b * b;
}

double sumOfSquare(double a, double b) {
	return a * a + b * b;
}

int main() {
	int m, n;
	cout << "Enter two integer: ";
	cin >> m >> n;
	cout << "Their sum of square: " << sumOfSquare(m, n) << endl;

	double x, y;
	cout << "Enter two real number: ";
	cin >> x >> y;
	cout << "Their sum of square: " << sumOfSquare(x, y) << endl;

	return 0;
}

八、C++系統函式

在這裡插入圖片描述

#include <iostream>
#include <cmath>
using namespace std;

const double PI = 3.14159265358979;

int main() {
	double angle;
	cout << "Please enter an angle: ";
	cin >> angle;	//輸入角度值

	double radian = angle * PI / 180;	//轉化為弧度值
	cout << "sin(" << angle << ") = " << sin(radian) <<endl;
	cout << "cos(" << angle << ") = " << cos(radian) <<endl;
	cout << "tan(" << angle << ") = " << tan(radian) <<endl;
	return 0;
}