关于递归次数的计算

有这样一个题目:

递归函数:

 1 int x(int n)
 2 {
 3     if(n<=3)
 4     {
 5         return 1;
 6     }
 7     else
 8     {
 9         return x(n-2)+x(n-4)+1;
10     }
11 }

计算x(x(8))递归调用次数。

大多数可能觉得这是一个很简单的题目,的确很简单。

但是要想在没有编译器的情况下正确的算出这个递归

调用次数其实还是需要点耐心.

x(x(8))我们先计算x(8),我们用count=0计数递归调用次数

1.x(8)=x(6)+x(4)+1 count=1;

2.x(6)=x(4)+x(2)+1,x(4)=x(2)+x(0)+1  x(8)=x(4)+2*x(2)+x(0)+3 count=3;

3.x(4)=x(2)+x(0)+1 x(8)=3*x(2)+2*x(0)+4  count=4

4.x(2)=1,x(0)=1; x(8)=9 count=9

再计算x(9)

1.x(9)=x(7)+x(5)+1 count=10

2.x(7)=x(5)+x(3)+1,x(5)=x(3)+x(1)+1  x(9)=x(5)+2*x(3)+x(1)+3 count=12

3.x(5)=x(3)+x(1)+1 x(9)=3*x(3)+2*x(1)+4 count=13

4.x(3)=1 x(1)=1   x(9)=3+2+4=9 count=18

接下来我们再用程序验证一下:

 1 #include <iostream>
 2 using namespace std;
 3
 4 static int count=0;
 5
 6 int x(int n)
 7 {
 8     if(n<=3)
 9     {
10         count++;
11         return 1;
12     }
13     else
14     {
15         count++;
16         return x(n-2)+x(n-4)+1;
17     }
18 }
19
20 int main(void)
21 {
22     cout<<"x(x8)="<<x(x(8))<<endl;
23     cout<<"count="<<count<<endl;
24     system("pause");
25     return 0;
26 }

运行截图:

验证正确了

对于这种计算递归调用次数一定要思路清晰,最好是将所有的递归调用都递归到递归出口的

地方再统一进行递归出口的调用,这样不容易造成紊乱,个人意见,仅供参考。

时间: 2024-10-26 18:46:06

关于递归次数的计算的相关文章

函数递归时,递归次数到900多时,就是抛出异常exception RuntimeError(&#39;maximum recursion depth exceeded&#39;,)

import subprocess import multiprocessing import urllib import sys import os import pymongo import signal import time client=pymongo.MongoClient("192.168.139.143",27017) db=client.domaindb collection=db.domain def getdomain(i): print("proces

关于归并排序元素之间比较次数的计算

问题:3,1,4,1,5,9,6,5 通过归并排序对它进行从大到小的排序 要进行多少次数组元素之间的比较?网站找的解决方法:第一趟合并(3,1),(4,1),(5,9),(5,6) ,元素之间共比较了4次;第二趟合并(4,3,1,1),(9,6,5,5),元素之间共比较了6次;为什么是6次?(3,1)和(4,1)是怎么比较得到(4,3,1,1)的呢?难道是插入排序?不是的.首先我把Left=(3,1),Right=(4,1),tmp数组用于排序好的结果,目前为空,也就是().用Left[0],,

关于插入排序元素之间比较次数的计算

问题:3,1,4,1,5,9,6,5  通过归并排序对它进行从小到大的排序  要进行多少次数组元素之间的比较? [3] 1 4 1 5 9 6 5 第一次排序结果:[1 3] 4 1 5 9 6 5; //新加入的3和1比较,比较次数1次 第二次排序结果:[1 3 4] 1 5 9 6 5; //新加入的4和3比较,比较次数1次 第三次排序结果:[1 1 3 4]  5 9 6 5; //新加入的1分别和4 3 1 比较,比较次数3次 第四次排序结果:[1 1 3 4 5] 9 6 5; //新

正则表达式关于次数的计算

表2.常用的限定符 代码/语法 说明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 其中,* + ?容易混淆,可以借用0与1的关系来助记 * 代表重复多于0 * 1次 + 代表重复多于0 + 1次 ?代表重复0或者1次 正则表达式关于次数的计算

python递归次数和堆栈溢出问题

在做递归的时候,测试了一下python的递归能力. 如果不设置递归次数的话,大概只能在992次左右,就会出现错误:RuntimeError: maximum recursion depth exceeded 如果使用代码: import sys sys.setrecursionlimit(1000000) #例如这里设置为一百万 设置了递归次数,到了9656次就会出现stack overflow的问题.查了一下,如果换成64位的python会好点.但是做递归容易引起溢出这个问题还是听蛋疼的,数据

关于时针和分钟重合次数的计算

在网上看到一道这样的题目. 在一天的24小时之中,时钟的时针.分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的? /* 1.一天是86400秒,表盘是半天一个周期,则只需要计算半天时间为43200秒  2.分针和时针重合,即分针和时针的角度是一样. 3.秒针走一秒,分针走360°/60 = 6°,时针走360°/43200 4.中午12点,则算是重回原点. */ declare @num int select @num = 0 while @num <= 43200  /*

php递归遍历目录计算其大小(文件包括目录和普通文件)

<?php function countdir($path){ $size = 0; //size = 0; 跟 size = null; 怎么结果不一样 $path = rtrim($path, '/').'/'; //因为用户输入的路径带不带/都可以,所以我这里要处理一下 $handle = opendir($path); //打开一个句柄 while($file = readdir($handle)){ //读取句柄中的文件,包括目录和文件 if($file == '.' || $file

python递归次数限制引起的错误

使用BeautifulSoup时,可能会抛出如下错误: RecursionError: maximum recursion depth exceeded while calling a Python object 查看系统递归限制,调大即可: sys.getrecursionlimit() 1000 sys.setrecursionlimit(2000) 原文地址:http://blog.51cto.com/13934611/2165572

Python实现斐波那契递归和尾递归计算

##斐波那契递归测试 def fibonacciRecursive(deepth): if deepth == 1: return 1 elif deepth == 2: return 1 else: return fibonacciRecursive(deepth - 1) + fibonacciRecursive(deepth - 2) ##斐波那契尾递归测试 def fibonacciTailRecursive(num, ret1, rte2): if num == 1: return r