c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?
@bytebuster的解决方案很好,但他没有解释他是如何创建它的,所以它只会帮助解决这个特定的问题。顺便说一句,你的公式看起来有点像斐波纳契(但不完全),它可以是calculated analytically without any looping(即使没有循环隐藏在Seq.unfold)。
你开始用下面的函数:
let rec f0 n =
match n with
| 0 | 1 | 2 -> 1
| _ -> f0 (n - 2) + f0 (n - 3)
的函数调用f0的参数n - 2和n - 3,所以我们需要知道这些值。诀窍是使用dynamic programming(可以使用memoization完成),但由于您不想使用memoization,所以我们可以手动编写它。
我们可以写f1 n,它返回一个三元组元组,其当前值和两个过去值为f0。这意味着f1 n = (f0 (n - 2), f0 (n - 1), f0 n):
let rec f1 n =
match n with
| 0 -> (0, 0, 1)
| 1 -> (0, 1, 1)
| 2 -> (1, 1, 1)
| _ ->
// Here we call `f1 (n - 1)` so we get values
// f0 (n - 3), f0 (n - 2), f0 (n - 1)
let fm3, fm2, fm1 = (f1 (n - 1))
(fm2, fm1, fm2 + fm3)
此功能无法尾recurisve,但它只是递归调用自己一次,这意味着我们可以使用蓄能器参数的模式:
let f2 n =
let rec loop (fm3, fm2, fm1) n =
match n with
| 2 -> (fm3, fm2, fm1)
| _ -> loop (fm2, fm1, fm2 + fm3) (n - 1)
match n with
| 0 -> (0, 0, 1)
| 1 -> (0, 1, 1)
| n -> loop (1, 1, 1) n
我们需要处理参数0和1专门在fc的主体中。对于任何其他输入,我们从最初的三个值(即(f0 0, f0 1, f0 2) = (1, 1, 1))开始,然后循环n次执行给定的递归步骤,直到达到2为止。递归loop函数是@bybbuster的解决方案使用Seq.unfold实现的。
所以,你的函数有一个尾递归版本,但只是因为我们可以简单地将过去的三个值保存在一个元组中。一般来说,如果计算出您需要的先前值的代码做了更复杂的事情,则这可能不可行。
c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?相关推荐
- c语言递归求n的阶乘之和,c语言用递归的方法实现1!+2!+3!+4!+.....+n!=?阶乘之和...
#include "stdafx.h" #include int getmul(int n){//递归求阶乘 int sum; int temp = 1; if(n<=0){ ...
- c语言递归求最大公约数
求两个正整数m和n的最大公约数. 输入样例1: 6 8 输出样例1: 2 //递归求最大公约数 #include<stdio.h>int f(int a,int b) {//比大小,确定被 ...
- c语言 递归 求公约数,递归求最大公约数
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #include "iostream" #include " ...
- C语言递归求四个数的最大值:Max函数的递归
递归算法求四个数的最大值 问题描述:通过函数的递归求四个数的最大值 解题思路:通过多次比较两个数进行比较大小,本质就是冒泡法排序 即: max_4=max_2(num1,max_2(num2,max_ ...
- c语言递归求差分方程,递归方程组解的渐进阶的求法——差分方程法
T(n)=c1T(n-1)+c2T(n-2)+-+ ckT(n-k)+f(n),n≥k (6.18) 的递归方程.其中ci (i=l,2,-,k)为实常数,且ck≠0.它可改写为一个线性常系数k阶非齐 ...
- c语言递归求差分方程,关于差分方程
在数学上,递推关系(recurrence relation),也就是差分方程(difference equation),是一种递推地定义一个序列的方程式:序列的每一项目是定义为前一项的函数. 举个例子 ...
- c语言递归求塔移动次数,c语言递归调用汉诺塔
递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件). 汉诺塔问题的重点是分析移动的规则,找到规律和边界条件. 若需 ...
- C语言 || 递归 || 求第n个人的年龄
题目描述: ----已知第一个人年龄为10岁,之后每一个人的年龄比前一个大2岁,求第n个人的年龄. 输入:输入一个整数 n ,表示要求第 n 个人的年龄. 输出:输出一个整数,表示第 n 个人的年龄. ...
- C语言 递归求n的阶乘和
思路:定义一个fun函数来求n的阶乘,主函数中用for循环来对阶乘求和.fun函数使用递归,每次调用自己,求出阶乘. #include<stdio.h> int fun(int n) {i ...
最新文章
- 如何设置REUSE_ALV_GRID_DISPLAY'的单个单元格的是否可以输入
- springboot集成rabbitMQ安装+代码
- matlab 将矩阵中的0置为Inf(邻接矩阵)
- printf()用法详解(转)
- springboot 定时任务schedule
- 数据结构:栈、队列、数组、链表、红黑树结构的特点
- 【数据结构与算法-1】常用数据结构
- 前端学习(1176):set数据结构2
- angular图片上传
- ModuleNotFoundError: No module named 'CommandNotFound'
- python、java大作战,python测试dubbo接口
- mysql rtree_优化体系--MySQL 索引优化(full-text、btree、hash、rtree)
- 第11章 Spring Boot使用Actuator
- 享元模式在 Java Integer 中的应用
- mysql主从延迟设置
- kido机器人没反应_QQ机器人常见故障排除方法
- 机器学习 | MATLAB实现GLM广义线性模型参数设定
- 如何优雅的对网页截取长图
- php识别手写图片,可识别手写字体的文字识别软件(附源码)
- click与onclick的区别
热门文章
- Storm精华问答 | task与executor有什么关系?
- apache过滤恶意频繁访问_采用网关过滤器实现权限验证及对异常统一处理
- Java中string与String区别_JAVA中String与StringBuffer的区别
- doremi服务器可以导出文件,Doremi服务器检查与IMB 的通信-放映技术论坛
- JobDataMap传递参数_02
- 创新小组 实战Git团队企操作手册_精华版本
- 推荐 12个Idea 免费实用插件及插件离线安装方法
- SpringBoot 2.0 开发案例之参数传递的正确姿势
- Can‘t connect to MySQL server on ‘localhost‘(10061)【SQLyog】
- 【Java】数据结构——栈(图文)