递归问题

1, 题目分析

1、问题描述; 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
分析:卖家在经过七个村子后剩下2只鸭子,令duck=2,他在每个村子卖出总数的一半还多一只,则可以求得第i个村子共有鸭子duck=(duck+1)2,在第i个村卖了x=duck/2+1只鸭子。
2、问题描述: 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
分析:设一个计数变量count,输入数字a,判断a是否等于0,若是,则计数加一,输出x,递归结束,否则判断x是否偶数,是偶数则计数加一,输出x,然后x=x/2,是奇数计数加一,输出x,然后x=x
3+1。

2、算法分析

对第一个问题,卖家在经过七个村子后剩下2只鸭子,令duck=2,他在每个村子卖出总数的一半还多一只,则可以求得第i个村子共有鸭子duck=(duck+1)*2,在第i个村卖了x=duck/2+1只鸭子。
总数:duck=(duck+1)
duck=(duck+1);x=duck/2+1 0<i<8 (递归体函数)
duck=duck i-0 (递归出口)

对第二个问题,设一个计数变量count,输入数字a,判断a是否等于0,若是,则计数加一,输出x,递归结束,否则判断x是否偶数,是偶数则计数加一,输出x,然后x=x/2,是奇数计数加一,输出x,然后x=x3+1。
输出x和count x1 (递归出口)
x=x/2 x%2
0 (递归函数)
x=x
3+1 x%2!=0

3、源程序

#include<iostream>
using namespace std;
int duck=2;  //全局变量 
int main()
{
	int N(int);
	N(7);
	return 0;
 } 

int N(int i)  //递归函数 
{
	int x;
	if(i==0)  //出口 
	{
		cout<<"鸭子总数是:"<<duck<<endl;
	}
	else
	{
		duck=(duck+1)*2;  //递归体 
		x=duck/2+1;
		cout<<"在第"<<i<<"个村子卖了"<<x<<"个鸭子"<<endl;
		i--;
		return N(i); 
	}
}
#include<iostream>
using namespace std;
void V(int x)  //递归函数 
{
	int static count=0;
	if(x==1)  //出口 
	{
		count++;
		cout<<x<<endl;
		cout<<"总步数是:"<<count<<endl;
		return;
	}
	else   //递归体 
	{
		if(x%2==0)
	    {
		    cout<<x<<"\t";
		    count++;
		    x=x/2;
	    }
	    else
	    {
		    cout<<x<<"\t";
		    count++;
		    x=x*3+1;
	    }
	}
    V(x);  //递归调用 
}

int main()
{
	int a;
	cout<<"请输入一个数用于求角谷数:"<<endl;
	cin>>a; 
	V(a);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值