递归和非递归实现规律函数

1、问题

A(n) = n / (2 * n + 1)
B1 = 2 + A1;
B2 = 2 + A1 * (2 + A2);
B3 = 2 + A1 * (2 + A2 * (2 + A3));
....以此类推,求B(n)

2、代码实现

#include <stdio.h>

/**
A(n) = n / (2 * n + 1)
B1 = 2 + A1;
B2 = 2 + A1 * (2 + A2);
B3 = 2 + A1 * (2 + A2 * (2 + A3));
....以此类推,求B()
**/
float A(float n)
{
if (n < 0)
return 0;
float result = n / (2 * n + 1);
return result;
}

//非递归实现
float B(float n)
{
if (n < 0)
return 0;
float sum = 1;
for (int i = n; i >= 1; --i)
{
sum = sum * A(i) + 2;
}
return sum;
}

//递归实现
float recursion_B(float n)
{
if (n < 0)
return 0;
static float sum = 1;
if (n == 0)
return sum;
else
{
sum = sum * A(n) + 2;
recursion_B(n - 1);
}
}

int main()
{
for (int i = 0; i < 20; i++)
printf("B(%d) is %f\n", i, B(i));
printf("recursion_B(10) is %f\n",  recursion_B(10));
}

 

3、运行结果

B(0) is 1.000000
B(1) is 2.333333
B(2) is 2.800000
B(3) is 2.990476
B(4) is 3.073016
B(5) is 3.109957
B(6) is 3.126829
B(7) is 3.134643
B(8) is 3.138300
B(9) is 3.140024
B(10) is 3.140842
B(11) is 3.141232
B(12) is 3.141419
B(13) is 3.141509
B(14) is 3.141552
B(15) is 3.141573
B(16) is 3.141583
B(17) is 3.141588
B(18) is 3.141591
B(19) is 3.141592
recursion_B(10) is 3.140842

 
(0)

相关推荐

  • C语言每日一练(002)

    题目 求数组元素之和 代码 首先,需要构造一个求和函数.这里求和函数有两种构造方法,一种是迭代法,另一个种是递归法. 迭代法求和函数 int sum(int a[], int n) { int i = ...

  • 算子扫描与递归核

    算子扫描与递归核 这是关于如何在TVM中进行循环计算的介绍资料.递归计算是神经网络的一种典型模式. from __future__ import absolute_import, print_func ...

  • 算法|1到100求和学算法之无尽的递归

    引言递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像.绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算 ...

  • 线性差值算法

    点斜式: #include<stdio.h>#define N 10float w = 10.0;float w0 = 0.0;float wn = 100.0;int adc[N+1] ...

  • Python|奇/偶数倒数求和之循环与递归的奥秘

    前言今天我们来解决粉丝提出的一个问题,如图: 问题描述编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n,输出结果示例:输 ...

  • Java递归

    递归就是:A方法调用A方法,自己调用自己 能不用就不用,只适合一下小的计算 1 @Test 2 public void test() { 3 Recursion recursion = new Rec ...

  • java实现二叉树的遍历(递归和非递归)

    源码地址: https://github.com/TimePickerWang/aimed-at-offer/blob/master/java%E6%BA%90%E7%A0%81/TreeInfo.j ...

  • 剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)

    剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)

  • 五分钟让你彻底理解二叉树的非递归遍历

    什么是二叉树 在计算机科学中二叉树,binary tree,是一种数据结构,在该数据结构中每个节点最多有两个子节点,如图所示: 二叉树的定义就是这样简单,但这种看起来很简单的数据结构遍历起来一点都不简 ...

  • 二叉树的前序遍历的非递归实现

    我们知道二叉树的遍历主要有,前序,中序,后续,我们常用递归的方式进行实现,而我们都知道能用递归函数实现,都可以用数据结构栈进行实现. 下面我们就用栈的数据结构来处理二叉树的前序遍历: BinaryTr ...

  • 剑指offer之先序非递归打印二叉树

    剑指offer之先序非递归打印二叉树

  • 剑指offer之中序打印二叉树(非递归实现)

    剑指offer之中序打印二叉树(非递归实现)

  • 胡大一:非传染性疾病的规律——《慢病防治指南》

    现在,人类正面对第二次卫生革命对象-非传染性疾病.非传染性疾病的源头是不健康的社会环境和与不健康社会环境互动的个体的不健康生活方式和行为.从源头(不健康的社会环境.生活方式和行为)又延伸出(慢性)非传 ...

  • 胡大一:非传染性疾病的规律

    现在,人类正面对第二次卫生革命对象--非传染性疾病.我们来看非传染性疾病的规律,它是怎样发生.发展的. 非传染性疾病的源头是不健康的社会环境和与不健康社会环境互动的个体的不健康生活方式和行为.从源头( ...

  • 递归调用函数专题-C语言

    0| 前言 本小节主要学习一种自己嵌套自己的函数调用方法--递归调用 1| 示例 例如,在给定整数n的情况下,计算并输入阶乘n!的程序. 阶乘函数的定义: int factorial(int n){ ...