当前位置: 首页 > news >正文

函数递归练习

目录

1.分析下面选择题

2.实现求第n个斐波那契数

3.编写一个函数实现n的k次方,使用递归实现。

4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

5.递归方式实现打印一个整数的每一位

6.实现求n的阶乘


1.分析下面选择题

根据下面递归函数:调用函数Fun(2),返回值是多少 (16)

int Fun(int n)      
{ if(n==5)   return 2;     else     return 2*Fun(n+1);      
}

解析:当n==5的时候退出递归 先递推,再回归 n=2的时候 一直递推 到2*fun(5) 的时候结束递推(一共三次递推),然后回归(也三次) ==> 4个2相乘 =16

2.实现求第n个斐波那契数

我们要先理解什么叫斐波那契数,简单解释一下吧

1 , 1 , 2 , 3 , 5.... 那就是前两个数相加等于第三个数,例如1+1=2 1+2=3 ....

  • 递归实现

假如用递归实现,要确定限制条件,那就是第一个数和第二数的时候都是返回1

Fib(1)=1,Fib(2)=1 因此我们设定条件n=1和n=2时返回1(限制条件)

而当n>=2是返回Fib (n-1)+Fib(n-2)实现递归(趋近于限制条件)

  • 递归函数的缺点: 其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。计算就会很慢

int Fib(int n) {if (n<=2) {return 1;}else{return Fib(n - 1) + Fib(n - 2);}
}
​
int main() {int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d", ret);
}
  • 迭代方式实现

  1. 在函数体内部,定义了三个整型变量 abc,分别用于保存斐波那契数列中的相邻三个数。

  2. 在循环体内,c = a + b; 表示将变量 c 赋值为 ab 的和,即斐波那契数列中的下一个数。

  3. 接着更新 ab 的值,将 a 更新为原来的 b,将 b 更新为原来的 c,以便下一次迭代计算。

int Fib(int n) {int a = 1;int b = 1;int c = 1;while (n>2){c = a + b; //a = b;b = c;n--;//减到<=2的时候退出循环}return c;
}
​
int main() {int n = 0;scanf("%d", &n);int r = Fib(n);printf("%d\n", r);return 0;
}

3.编写一个函数实现n的k次方,使用递归实现。

  • 思考一下,什么是限制条件?

  • 当指数k一直减减减到为0的时候,那么结果返回1,结束递归

  • power(n, k - 1): 这部分是递归调用,它会计算 nk - 1 次方。这就是递归的关键,它通过反复调用自身来逐步减小问题的规模。

  • n * power(n, k - 1): 这里将 nnk - 1 次方相乘,从而得到 nk 次方。因为 nk 次方可以表示为 n 乘以 nk - 1 次方。

#include <stdio.h>
​
// 递归函数计算n的k次方
double power(double n, int k) {// 递归基if (k == 0)return 1;// 若k为负数,则返回1除以n的-k次方if (k < 0)return 1 / power(n, -k);// 递归计算n的k次方return n * power(n, k - 1);
}
​
int main() {double n;int k;printf("请输入底数n和指数k:");scanf("%lf%d", &n, &k);double result = power(n, k);printf("%.2lf的%d次方为%.2lf\n", n, k, result);return 0;
}

4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

int DigitSum(int n)
{if (n < 10)return n;else{int sum = n % 10 + DigitSum(n / 10);return sum;}
}
int main()
{int n = 0;scanf("%d", &n);printf("%d", DigitSum(n));return 0;
}
​

5.递归方式实现打印一个整数的每一位

  • 分析:用递归的方法 我们将 1234 按顺序输出 1 2 3 4

    我们可以定义一个Print()函数

    先递推:(一直递推到最高位,然后再从最高位开始打印,就会按顺序输出)

    (1234) 除以十去掉最后一位 (123) 4

    (123) 4 ---> (12) 3 4 ----> (1)2 3 4 ---> 1 2 3 4

    每次都调用自己,直到不能再分(限制条件)

    后回归:

  • 最后当n=1的时候不满足n>9的条件,达到限制条件然后进行回归,

    1%10 = 1

    12%10=2

    123%10 =3

    然后再顺序输出1 2 3

int Print(int n) {if (n > 9)//当n是两位数以上{Print(n / 10);}printf("%d ", n % 10);
}
int main() {int n = 0;scanf("%d", &n);Print(n);
}
 

6.实现求n的阶乘

递归和非递归分别实现(不考虑溢出的问题)

  • 递归的方法

  • 当n=0的时候 阶层为1 ==>限制条件

  • 不等于0的时候就算阶层

//递归方式
int Fact(int n) {if (0 == n) {return 1;}else{return n * Fact(n - 1);}
}
int main() {int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);return 0;
}
  • 非递归方法

int Fact(int n) {int sum = 1;int i = 0;for (i = 1; i <= n; i++) {sum *= i;}return sum;}
int main() {int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);return 0;
}

http://www.lryc.cn/news/350201.html

相关文章:

  • 公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)
  • 【Day3:JAVA运算符、方法的介绍】
  • Chrome查看User Agent的实战教程
  • Linux 第三十四章
  • 国际化日期(inti)
  • 【论文阅读笔记】jTrans(ISSTA 22)
  • 单位个人如何向期刊投稿发表文章?
  • Redis数据结构-RedisObject
  • Vue 中使用 el-date-picker 限制只能选择当天、当天之前或当天之后日期的方法详解
  • 系列介绍:《创意代码:Processing艺术编程之旅》
  • 深度学习设计模式之抽象工厂模式
  • K8s是什么?
  • 【网站项目】SpringBoot796水产养殖系统
  • Vue详细介绍
  • 声纹识别的对抗与防御
  • C++ QT设计模式总结
  • 洛谷 P3203:弹飞绵羊 ← 分块算法(单点更新、单点查询)
  • 程序验证之Dafny--证明霍尔逻辑的半自动化利器
  • Flutter 中的 SafeArea 小部件:全面指南
  • webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图
  • Spacy的安装与使用教程
  • Pathlib,一个不怕迷路的 Python 向导
  • 详解绝对路径和相对路径的区别
  • C++二叉搜索树搜索二叉树二叉排序树
  • Java 自然排序和比较器排序区别?Comparable接口和Comparator比较器区别?
  • 【CV】opencv调用DIS/LK等计算光流,前一帧和当前帧写反了有什么影响?
  • C语言学习细节|C语言面向对象编程!函数指针如何正确使用
  • C语言简要(一)
  • 那些年我与c++的叫板(一)--string类自实现
  • 二刷算法训练营Day08 | 字符串(1/2)