C++中的递归

递归的定义

所谓递归,就是在一个函数的内部调用这个函数,那么递归自然包含调用这个函数的部分,为了终止递归的过程,还需要定义一个递归终止的条件。
递归的简单结构:

返回值类型 函数名(参数){
	if(递归终止条件){
		终止递归;
	}
	else{
		 包含本函数调用的语句
	}
}
实例1:用递归求斐波拉契数列

首先,斐波拉契数列是指:1,1,2,3,5,…,n这样的数字,其中,第n个数字是第n-1和第n-2个数字之和(n>2)。
我们可以得到第三个及以后的数的计算公式:feibo(n) = feibo(n-1)+feibo(n-2);
下来看实现方法:

int feibo(int n){ //n表示要求斐波拉契数列中的第几个数
	if(n==1) return 1;
	if(n==2) return 1;
	else{
		return feibo(n-1)+feibo(n-2);
	}
}
int main(){
	int result = feibo(5); 
	cout<<result;  //5
}

上述过程的解析:
在这里插入图片描述

实例2:阶乘的递归实现

同样,要求n的阶乘,必须求出(n-1)的阶乘,可得公式:n!=n*(n-1)!

long multi(int n){
	if(n==1) return 1;
	else return n*multi(n-1);
}
int main(){
	long result;
	result = multi(4);
	cout<<result; //结果为24
}
实例3:求n个元素的所有排列方式

令E={e1,e2,…,en}来表示n个元素,令Ei为E中除去元素i以后所得的集合,perm(X)表示集合X中元素的排列方式,而ei.perm(X)表示在perm(X)的每个排列方式前面加上ei以后所得到的排列方式。如:假定E={a,b,c},i=1,则perm(E1)={bc,cb};而e1.perm(E1)={abc,acb}。
从上面可以看到,当E中只剩一个元素,即n=1时,只有一种排列 方式,即perm(E)={e},其中,e是E中唯一的一个元素。而当n>1时,perm(E)=e1.perm(E1)+e2.perm(E2)+…+en.perm(En),这种递归形式定义是采用n个perm(X)来定义perm(E),其中每个x包含n-1个 元素,至此,一个完整的递归定义所需要的基本部分和递归部分均已完成。

template<class T>
void perm(T arr[],int k,int m){
	int i;
	if(k==m){ //输出一个排列方式
		for(i=0;i<=m;i++){
			cout<<arr[i];
		}
		cout<<endl;
	}
	else if(k<m){
		for(i=k;i<=m;i++){
			std::swap(arr[k],arr[i]);
			perm(arr,k+1,m);
			std::swap(arr[k],arr[i]);
		}
	}
}

在上面程序中,这段代码输出所有前缀为arr[0:k-1],后缀为arr[k:m]的排列方式,调用perm(arr,0,n-1)将得到arr[0:n-1]的所有n!个排列方式,在该调用中,k=0,m=n-1,因此排列方式的前缀为空,后缀为list[0: n-1] 产生的所有排列方式。当k =m 时,仅有一个后缀l i s t [ m ],因此list[0: m] 即是所要产生的输出。当k<m时,先用list[k] 与l i s t [ k:m] 中的每个元素进行交换,然后产生list[k+1: m]的所有排列方式,并用它作为list[0: k] 的后缀。
当n= 3并且E=(a, b, c)时,按照前面的递归定义可得perm (E) =a.perm ( {b, c} ) +b.perm ( {a,c} ) +c.perm ( {a, b} )。同样,按照递归定义有 perm ( {b, c} )=b.perm ( {c} ) +c.perm ( {b}), 所以a.perm ( {b, c} ) = ab.perm ( {c} )+ac.perm({b}) = a b . c + ac.b = (a b c, a c b)。同理可得b.perm ( {a, c})=ba.perm ( {c}) + bc.perm ( {a}) = b a . c + b c . a = (b a c, b c a),c.perm ( {a, b})=ca.perm ( {b}) + cb.perm ( {a}) = c a . b + c b . a = (c a b, c b a)。所以perm (E) = (a b c, a c b, b a c, b c a,c a b, c b a)。
编写下面测试程序:

int main(){
	char ch[] = {'a','b','c'};
    perm(ch,0,2);
}

程序的部分执行过程如下图:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值