C语言——角谷定理递归函数实现

写在最前面

今天写的这道题其实不难,而且题目几乎把难点都提出来了,但是我还是花了很长时间找bug,真的是老学长大型翻车现场!在定义整形变量的时候直接把scanf()赋值给了这个整型变量结果一直计算不正确,唉,看了好久才发现!scanf()函数正常调用后会返回1.
来看题目!

递归函数求计算次数

输入一个自然数:若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此的有限次运算后,总可以得到自然数值1。求经过多少次运算,可得到自然数1。自然数1,认为经过0次计算得到。

提示,假定参数名为n:

(1)参数是1的时候,固定返回0;

(2)不满足上述条件,且参数是偶数的时候,返回值是f(n/2)+1;

(3)上述两个条件都不满足,返回值是f(n*3+1)+1。

输入格式:
用户输入一个大于等于1的整数。

输出格式:
输出一个正整数。

输入样例:

8

输出样例:
用户输入8的时候,8除以2等于4,4除以2等于2,2除以2等于1。所以从8到1,需要经过3次运算。

3

输入样例:

3

输出样例:

7

先来看看正确的代码:

#include<stdio.h>
int f(int n);

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",f(n));
    return 0;
}

int f(int n){
 if(n == 1){
     return 0;
    
 }else  if(n%2 == 0){
     return f(n/2)+1;
 }
 else{
     return f(n*3+1)+1;
 }
  
    return 0;

}

一开始写错的地方

 int n=scanf("%d",&n);

题目里面n是用户输入的数字,要判断这个数经过多少次运算才能变成1,所以给n赋值错了,肯定就计算不出来正确结果!

通过这个题目告诉我们,写代码一定要仔细,错了要从头开始看!不要凭感觉只看一部分代码!

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值