冰雹猜想
作者:互联网
题目描述
给出一个正整数 n(n\le 100)n(n≤100),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证很大的数字(7\times10^{11}7×1011)都可以按照这样的方式比变成 1,所以被称为“冰雹猜想”。例如当 nn 是 20,变化的过程是 [20, 10, 5, 16, 8, 4, 2, 1]。根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。
输入输出样例
输入 #120输出 #1
1 2 4 8 16 5 10 20
题目分析
首先我们得出了下列信息:
1.如果为奇数就乘以3加1
2.如果为偶数就除以2
3.递归调用方法可以比较简单的实现函数
注意:这里输出顺序是倒序,只要把输出放在迭代函数的后面,就可以实现倒序。
上代码:
#include<cstdio>
#include<iostream>
using namespace std;
void fun(int n);//声明函数的递归
int main()
{
int n;
scanf("%d", &n);
fun(n);cout << endl;
return 0;
}
void fun(int n) //用函数的递归来完成题目
{
if(n==1) {cout << 1 << ' ';
return ;
}
else if(n%2==0) fun(n/2);//如果是偶数就不断递归n/2
else fun(n*3 + 1);//如果是奇数就不断递归 n*3 + 1
cout << n << ' '; //把输出放在迭代函数的后面,就可以实现倒叙。
return ;
}
这样实现了倒序排序。输入20 得出的结果是1 2 4 8 16 5 10 20
但是如果把cout << n << ' '; //把输出放在递归函数的后面,就可以实现倒叙。放在递归函数的前面
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
void fun(int n);//声明函数的递归
int main()
{
int n;
scanf("%d", &n);
fun(n);cout << endl;
return 0;
}
void fun(int n) //用函数的递归来完成题目
{
cout << n << ' ';
if(n==1)
{ cout << 1 << ' '; return ; }
else if(n%2==0) fun(n/2);//如果是偶数就不断递归n/2
else fun(n*3 + 1);//如果是奇数就不断递归 n*3 + 1
return ;
}
题目总结
1.大家可以观察一下递归函数中cout << n << ' '; 这条语句在后面可以实现倒叙,如果在前面实现的是正序排列。
2.注意递归调用的方法可以解决一些多次调用的问题。
3.注意奇数和偶数的判断。
4.调用函数的声明位置注意。
5.结果经过调试和验证。
标签:20,猜想,递归,int,冰雹,fun,return,cout 来源: https://www.cnblogs.com/limingze/p/14801181.html