法一:递归调用:
#include<stdio.h>
int reverse(int x);
int reverse(int x)
{
if(x==1)
{
// return 1; 这样写是没有意义的 因为这个是结束条件 如果输入的值不是1 结束后在主函数中 没有把返回的值赋给新变量 main函数打印地只是单纯的i也就是最大的数
return ;// 直接return回到主函数就可以了
} //如果一开始就是1 可直接返回不用执行
else if(x%2==0)
{
//reverse(x/2); 这样写是不对的! 当x/2==1 的时候 会return1 那么就无法执行到printf 1 了
x=x/2;
}
else
{
// reverse(x*3+1);不对!
x=x*3+1;
}
reverse(x); //如果是先改变x的值 再调用
printf("%d ",x); //会先全部调用完 再倒序输出 相当于先进后出
}
int main()
{
int i;
scanf("%d",&i);
reverse(i);
printf("%d",i); //输出最开始输入的最大的数
return 0;
}
//若按照我之前那样写 会漏了1没有打印 为什么?
补充递归
法二:数组倒序输出(j--)
#include<stdio.h>
int main()
{ int a[1000],i=1,n,j; //虽然题目说n小于100 但因为有的数*了之后变大,从而数变多 所以要用1000
scanf("%d",&n);
// if(n==1)
// {
// printf("1"); 与后面重复 多此一举
// }
while(n!=1)
{ a[i]=n;
i++;
if(n%2==0) n/=2;//当再这里 n==1后,不会再进入while循环 不会再存到 a数组中 但是已经i++了
else n=3*n+1;
}
a[i]=1; // 因为i++里面没存到数字 所以 赋值给最后一个
for(j=i;j>=1;j--) //用j--来反向输出
{
printf("%d ",a[j]);
}
return 0;