@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语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?相关推荐

  1. c语言递归求n的阶乘之和,c语言用递归的方法实现1!+2!+3!+4!+.....+n!=?阶乘之和...

    #include "stdafx.h" #include int getmul(int n){//递归求阶乘 int sum; int temp = 1; if(n<=0){ ...

  2. c语言递归求最大公约数

    求两个正整数m和n的最大公约数. 输入样例1: 6 8 输出样例1: 2 //递归求最大公约数 #include<stdio.h>int f(int a,int b) {//比大小,确定被 ...

  3. c语言 递归 求公约数,递归求最大公约数

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #include "iostream" #include " ...

  4. C语言递归求四个数的最大值:Max函数的递归

    递归算法求四个数的最大值 问题描述:通过函数的递归求四个数的最大值 解题思路:通过多次比较两个数进行比较大小,本质就是冒泡法排序 即: max_4=max_2(num1,max_2(num2,max_ ...

  5. 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阶非齐 ...

  6. c语言递归求差分方程,关于差分方程

    在数学上,递推关系(recurrence relation),也就是差分方程(difference equation),是一种递推地定义一个序列的方程式:序列的每一项目是定义为前一项的函数. 举个例子 ...

  7. c语言递归求塔移动次数,c语言递归调用汉诺塔

    递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件). 汉诺塔问题的重点是分析移动的规则,找到规律和边界条件. 若需 ...

  8. C语言 || 递归 || 求第n个人的年龄

    题目描述: ----已知第一个人年龄为10岁,之后每一个人的年龄比前一个大2岁,求第n个人的年龄. 输入:输入一个整数 n ,表示要求第 n 个人的年龄. 输出:输出一个整数,表示第 n 个人的年龄. ...

  9. C语言 递归求n的阶乘和

    思路:定义一个fun函数来求n的阶乘,主函数中用for循环来对阶乘求和.fun函数使用递归,每次调用自己,求出阶乘. #include<stdio.h> int fun(int n) {i ...

最新文章

  1. 如何设置REUSE_ALV_GRID_DISPLAY'的单个单元格的是否可以输入
  2. springboot集成rabbitMQ安装+代码
  3. matlab 将矩阵中的0置为Inf(邻接矩阵)
  4. printf()用法详解(转)
  5. springboot 定时任务schedule
  6. 数据结构:栈、队列、数组、链表、红黑树结构的特点
  7. 【数据结构与算法-1】常用数据结构
  8. 前端学习(1176):set数据结构2
  9. angular图片上传
  10. ModuleNotFoundError: No module named 'CommandNotFound'
  11. python、java大作战,python测试dubbo接口
  12. mysql rtree_优化体系--MySQL 索引优化(full-text、btree、hash、rtree)
  13. 第11章 Spring Boot使用Actuator
  14. 享元模式在 Java Integer 中的应用
  15. mysql主从延迟设置
  16. kido机器人没反应_QQ机器人常见故障排除方法
  17. 机器学习 | MATLAB实现GLM广义线性模型参数设定
  18. 如何优雅的对网页截取长图
  19. php识别手写图片,可识别手写字体的文字识别软件(附源码)
  20. click与onclick的区别

热门文章

  1. Storm精华问答 | task与executor有什么关系?
  2. apache过滤恶意频繁访问_采用网关过滤器实现权限验证及对异常统一处理
  3. Java中string与String区别_JAVA中String与StringBuffer的区别
  4. doremi服务器可以导出文件,Doremi服务器检查与IMB 的通信-放映技术论坛
  5. JobDataMap传递参数_02
  6. 创新小组 实战Git团队企操作手册_精华版本
  7. 推荐 12个Idea 免费实用插件及插件离线安装方法
  8. SpringBoot 2.0 开发案例之参数传递的正确姿势
  9. Can‘t connect to MySQL server on ‘localhost‘(10061)【SQLyog】
  10. 【Java】数据结构——栈(图文)