SICP:1.37 递归/迭代求无穷连分式

#lang racket

(define (cont-frac N D k)
  (define (cf t)
    (if (= t 1)
    (/ (N t) (D t))
    (/ (N t) (+ (D t) (cf (- t 1))))
    );if
    );cf
  (cf k)
  );cont-frac

(define (cont-frac-iteration N D k)
  (define (cf result t)
    (if (= t k)
    result
    (cf (/ (N t) (+ (D t) result));/
        (+ t 1));cf
    );if
    );cf
  (cf (/(N k) (D k)) 1)
  );cont-frac-iteration

(cont-frac (lambda(i) 1.0)
       (lambda(i) 1.0)
       10)

(cont-frac-iteration (lambda(i) 1.0)
       (lambda(i) 1.0)
       10)

因为连分式本质上就是一个除法计算序列,所以题目给出 k 项连分式:

N1D1+N2?+NkDk

可以转换成以下等价的除法计算序列:

N1/(D1+(N2/(D2+?+(Nk/Dk))))

而这个除法序列又可以用一个递归表达式来表示:

cf(1)

N1/(D1+cf(2))

N1/(D1+(N2/(D2+cf(3))))

N1/(D1+(N2/(D2+(N3/(D3+cf(4))))))

?

N1/(D1+(N2/(D2+(N3/(D3+?+(Nk/Dk))))))

其中函数 cf(i) 表示连分式的第 i 个项。

时间: 2024-11-05 14:50:44

SICP:1.37 递归/迭代求无穷连分式的相关文章

SICP 关于递归迭代的重新理解以及尾递归的引入...

看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭代是站在编译器/解释器的基础上来看的,而我之前是站在语言(类C语言的)的具体实现的角度看的.理解这个需要先看书中提到的两个概念: 1.递归过程                    2.递归的计算过程 可以用书中举出的阶乘的例子来看 实现1: 1 (factorial 6) 2 (* 6 (fact

javase_递归&迭代

一.递归  程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.  递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不满足时,递归前进:当边界条件满足时,递归返回.

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

(转)递归树求递归算法的时间复杂度

本文转载:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html 递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2) 2) 还可以继续迭代,将其完全展开可得: T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23) 2 + 2((n/24) 2 +-

考察数据类型的掌握---题目1166:迭代求立方根 (2009年北京航空航天大学计算机研究生机试真题)

题目描述: 立方根的逼近迭代方程是 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0=x.求给定的x经过n次迭代后立方根的值. 输入: 输入有多组数据.每组一行,输入x n. 输出: 迭代n次后的立方根,double精度,保留小数点后面六位. 样例输入: 3000000 28 样例输出: 144.224957 #include "stdio.h" int main(int argc, char* argv[]) {     long n;     dou

编程算法 - 中序遍历 递归/迭代 代码(C)

中序遍历 递归/迭代 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 中序遍历(InOrder)作为二叉搜索树的排序方式, 有着重要的作用. 递归和迭代的方法都需要掌握, 迭代主要使用了栈(stack)进行输入输出. 代码: /* * main.cpp * * Created on: 2014.9.18 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #inclu

用递归实现求一个迷宫是否有通路

今天终于把昨天下午没写出来的迷宫求是否有通路的cpp写出来了 使用递归实现的,不过算法的质量不怎么样,使用穷举法实现的. 在网上搜了一下,发现还有很多的更优的算法,哈哈,不过怎么说都是自己一个个地代码敲出来的. 特点是发现在linux下面调试真的有时候自己会崩溃,还好最终还是搞出来了. 哈哈,发上来给类似我这种的算法新手来一起分享一下: 路径就记录在栈里面,需要得出具体路径的可以小改一下就行了. findRoad.cpp //迷宫求解问题思路 //1.用一个矩阵来表示迷宫,即n*m数组 //用穷

分治递归:求数组元素的最大值,最小值

//分治递归,求数组元素的最大值,最小值 /** * 保存产生的最大值,最小值 * @author Administrator * */ public class Values { private int max; private int min; public Values(int max,int min){ this.max=max; this.min=min; } public int getMax() { return max; } public void setMax(int max)

非递归版求幂函数

#include<stdio.h> int MinSubsequenceSum(const int A[],int n) { int i,sum,MinSum; sum=MinSum=0; for(i=0;i<n;i++) { sum+=A[i]; if(sum<MinSum) MinSum=sum; if(sum>0) sum=0; } return MinSum; } void main() { int arr[10]={3,4,-2,5,-4,6,-2,8,-9,-23