SICP-1.7-递归函数

递归函数

  • 函数内部直接或间接的调用函数自身
  • 将复杂问题简单化

例子程序

  • def sum_digits(n):
            """Return the sum of the digits of positive integer n."""
            if n < 10:
                return n
            else:
                all_but_last, last = n // 10, n % 10
                return sum_digits(all_but_last) + last
  • 各位数字之和问题分解为两个步骤
    • 除了最后一个数字以外所有数字相加
    • 然后加上最后一个数字

相互递归

  • def is_even(n):
        if n == 0:
            reutrn True
        else:
            return is_odd(n-1)
    
    def is_odd(n):
        if n == 0:
            return False
        else:
            return is_even(n-1)
    
    result = is_even(4)
  • game
  • 一个双人游戏,桌上有n个鹅卵石,每次一个人能从桌子上拿走一个或两个鹅卵石,拿走最后一个鹅卵石的人胜利
    • Alice每次只拿走一个鹅卵石
    • Tom在鹅卵石是偶数的时候拿走两个鹅卵石,反之拿走一个鹅卵石
    • 最终谁会获胜
  • def play_Alice(n):
        if n == 0:
            print("Tom wins!")
        else:
            play_Tom(n-1)
    
    def play_Tom(n):
        if n == 0:
            print("Alice wins!")
        elif(n%2 == 0):
            play_Alice(n-2)
        else:
            play_Alice(n-1)

树递归

  • 一个函数调用自己大于一次
  • 例子(斐波那契数列):
    • def Fibo(n):
          if n == 1:
              return 0
          if n == 2:
              return 1
          if n > 2:
              return Fibo(n-2) + Fibo(n-1)
      def count_partitions(n, m):
              """Count the ways to partition n using parts up to m."""
              if n == 0:
                  return 1
              elif n < 0:
                  return 0
              elif m == 0:
                  return 0
              else:
                  return count_partitions(n-m, m) + count_partitions(n, m-1)
    • 不断将函数以m为界分段,直到全部分为1
时间: 2024-10-19 14:53:26

SICP-1.7-递归函数的相关文章

关于递归函数的简单认识

关于递归函数的认识是在学习了数据结构的栈这一概念后有新的理解. 首先说一下递归函数的概念,我的理解就是一个自己调用自己本身的函数.既然是调用函数,那先看一下普通的函数调用问题. 一.普通函数调用问题 用主函数main()调用函数sum()函数来作比: void main(){ //其他语句1 sum(); //其他语句2 } 整个程序运行的入口是main(),当main()函数运行完“其他语句1”遇到sum();语句时,main做的工作就是: 1.保存现场(保存现场这一操作就用到了前面提到的栈)

SICP 习题 (1.46)解题总结

SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测.过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好.题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-point过程. 因为涉及到高阶函数,所以整个题目理解起来有一点点费劲.不过这道题作为第一章的收官题确实

SICP 1.19

解:这道题很有意思,结论是斐波那契数也可以用对数时间复杂度获得. 通过Tpq(Tpq)=TPQ建立方程,解得: P=pp+qq Q=qq+2pq 程序如下: (define (fib n)   (define (even? n)     (= (remainder n 2) 0))   (define (fib-iter a b p q count)     (cond ((= count 0) b)           ((even? count) (fib-iter a           

SICP 1.12

解: (define (pascal n)   (define (get n i)     (cond ((<= i 1) 1)           ((>= i n) 1)           (else (+ (get (- n 1) (- i 1))                    (get (- n 1) i)))))   (define (iter i n)     (if (<= i n)         (and (print (get n i))          

关于JS递归函数细化认识及实用实例

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

JavaScript正则表达式检验与递归函数实际应用

JS递归函数(菲波那切数列) 实例解析: 一组数字:0  1  1  2  3  5  8  13 0  1  2  3  4  5  6  7 sl(0)=0; sl(1)=1; sl(2)=sl(0)+sl(1); sl(3)=sl(1)+sl(2); function sl(i){ if(i==0){ return  0; }else if(i==1){ return  1; }else{ return  sl(i-1)+sl(i-2); } } 正则表达式检验 //校验是否全由数字组成

python开发函数进阶:递归函数

一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #:基础版本 5 def story(): 6 print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?") 7 while True: 8 story() 9 10 #:递归版本 11 def story

Day10:内置函数、匿名函数、递归函数

一.内置函数 1.数学运算类 2.集合类操作 内置函数个别使用示例 1.any 集合中的元素有一个为真的时候为真, 特别的,若为空串返回为False 1 print(any([0,''])) 2 print(any([0,'',1])) 执行结果 1 False 2 True 2.divmod 取商得余数,用于做分页显示功能 1 print(divmod(10,3)) #取商得余数,用于做分页显示 执行结果 1 (3, 1) 3.eval  把字符串中的数据结构给提取出来 1 dic={'nam

递归函数初探讨

什么是递归? 所谓的递归 ,就是函数自己直接或者间接的调用自己.复杂算法通常比较容易使用递归实现 从前有座山,山里有座庙,庙里有个老和尚讲故事,从前有座山,山里有座庙,庙里... 这个故事就是现实中递归的一个例子,循环往复,生生不息. 以下就是递归函数最简单的一个例子 function foo(n){ return n + foo(n-1); } foo(); 递归中最重要的就是如何跳出循环,因为只有程序跳出了才有结果.如果定义错误,或者缺少终结条件 可导致冻结用户界面 递归的思想:划归思想 递

python递归函数下不能正常使用yield

# -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdir(path) for file in listFile: try: file =os.path.join(path,file) if os.path.isfile(file): yield file # test1 #file_list.append(file) # test2 #print(fi