递归函数

(1)编写递归函数求出n的阶乘(自定义main函数,调用定义的递归函数)

#include<iostream>
using namespace std;

int fac(int x);
int fac(int x)
{
	int n;
	if(x==0) n=1;
	else n=fac(x-1)*x;
	return n;	
}
int main()
{
	int n,m;
	cin>>n;
	m=fac(n);
	cout<<m<<endl;
	return 0;
}

(2)写出求1*3*...*n的递归式,并编写出递归函数求解。

</pre><pre class="cpp" name="code">#include<iostream>
using namespace std;

int fac(int x)
{
	int n;
	if(x==1) n=1;
	else n=fac(x-2)*x;
	return n;	
}

int main()
{
	int m,n;
	cout<<"输入一个数:"<<endl;
	cin>>n;
	if(n%2==0)
		n=n-1;
	m=fac(n);
	cout<<"奇数乘积是"<<m<<endl;
	return 0;
}


(3)编程序,用递归函数求出两个数的最大公约数。(包括编main函数,调用定义的递归函数)

#include<iostream>
using namespace std;

int fac(int x,int y)
{
	int m,n;
	int temp;
	if(x<y)
	{
		temp=x;x=y;y=temp;
	}
	if(y==0)
		m=x;
	else
	{
		n=x%y;
		m=fac(y,n);
	}
	return m;
}

int main()
{
	int m,n,p;
	cout<<"输入两个数:"<<endl;
	cin>>m>>n;
	p=fac(m,n);
	cout<<"最大公约数是"<<p<<endl;
	return 0;
}


(4)编制递归函数fib(int n)返回第n个Fibnacci数,以此输出Fibnacci序列的第20个数。

#include<iostream>
using namespace std;
int m=1;

int fib(int n)
{
    if(n==1)  
        return 1;  
    else if(n==2)  
        return 1;  
    else  
        return(fib(n-1)+fib(n-2));  

}
int main()
{
	int n,m;
	cout<<"输入数列中的第n个数:"<<endl;
	cin>>n;
	m=fib(n);
	cout<<"第"<<n<<"个数是:"<<m<<endl;
	return 0;
}
(5)输入一个整数n,要求输出对应的二进制形式,请用递归函数实现。
#include<iostream>
using namespace std;

int bina(int n)
{
	int m,a;
	m=n%2;
	a=n/2;
	if(n==0)
		return 0;//终止条件
	bina(a);
	cout<<m;
	return m;
}

int main()
{
	int n;
	cout<<"输入一个数:";
	cin>>n;
	bina(n);
	cout<<endl;
}



(6)汉诺塔

#include<iostream>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
	if(n==1)
		cout<<A<<"->"<<C<<endl;
	else
	{
		hanoi(n-1,A,C,B);
		cout<<A<<"->"<<C<<endl;
		hanoi(n-1,B,A,C);
	}

}
int main()
{
	int n;
	cin>>n;
	hanoi(n,'A','B','C');
	return 0;
}



心得:递归算法还是不熟悉,就这五个题还是花了好几个小时才写完,递归的时候总是忘记写终止条件,程序也就一遍一遍的崩溃,找不到原因的时候,心里还是特别烦躁,反正觉得,从现在开始,后面的问题也就没有之前的那么简单了,之前的不用看参考也能写出个大概,但汉诺塔的意思虽然知道,单用程序就让我很难下手,再看了好几遍理解才弄了个大概,还得一步一步慢慢来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值