首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将一个函数应用于haskell列表中的第n项n次

在Haskell中,可以使用递归和模式匹配来将一个函数应用于列表中的第n项n次。

首先,我们需要定义一个函数,该函数接受一个函数f和一个整数n作为参数,并将f应用到列表中的第n项n次。下面是一个示例实现:

代码语言:txt
复制
applyNTimes :: (a -> a) -> Int -> [a] -> [a]
applyNTimes _ _ [] = []
applyNTimes f 0 xs = xs
applyNTimes f n (x:xs) = x : applyNTimes f (n-1) (f x : xs)

上述函数的实现逻辑如下:

  1. 如果列表为空,则返回一个空列表。
  2. 如果n为0,则直接返回原始列表。
  3. 如果n大于0,则将函数f应用于列表中的第一个元素,并将结果作为新的第一个元素。然后,递归调用applyNTimes函数,将n减1,并将新的第一个元素加入到剩余列表中。

以下是对该函数的一些说明:

  • 参数f是一个接受类型为a的参数并返回类型为a的函数。
  • 参数n是一个整数,表示应用函数的次数。
  • 参数[a]是一个泛型列表,其中的元素类型为a。

下面是一些示例用法:

代码语言:txt
复制
-- 将元素加倍3次
doubleNTimes :: Num a => [a] -> [a]
doubleNTimes xs = applyNTimes (*2) 3 xs

-- 将元素平方2次
squareNTimes :: Num a => [a] -> [a]
squareNTimes xs = applyNTimes (^2) 2 xs

-- 示例输出
main :: IO ()
main = do
  let myList = [1, 2, 3, 4, 5]
  putStrLn "Original list:"
  print myList
  putStrLn "After doubling 3 times:"
  print (doubleNTimes myList)
  putStrLn "After squaring 2 times:"
  print (squareNTimes myList)

以上示例输出:

代码语言:txt
复制
Original list:
[1,2,3,4,5]
After doubling 3 times:
[1,2,4,8,16,32]
After squaring 2 times:
[1,4,16,256,65536]

在这个示例中,我们定义了两个使用applyNTimes函数的示例函数doubleNTimes和squareNTimes。这些函数分别将元素加倍3次和将元素平方2次。然后我们将一个整数列表应用于这些函数并打印结果。

请注意,以上示例只是演示如何在Haskell中实现将一个函数应用于列表中的第n项n次。实际应用中,您可能需要根据具体需求自定义函数和使用不同的函数。如果您对Haskell编程语言感兴趣,可以参考Haskell官方文档来了解更多信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Fibonacci数列n7种计算方法:Python列表

前面已经分享了几种计算Fibonacci数列n方法,详见Python快速计算Fibonacci数列n方法和三种Fibonacci数列n计算方法及其优劣分析,本文分享7种(过几天分享...8种),主要演示列表append()和pop()这两个方法和反向索引用法。...如果n小的话,可以只append()不pop()(注意,这样的话append()参数要改为data[-1]+data[-2]),但是如果n很大的话会导致内存崩溃。...下面的代码使用800万对本文7种方法和前面6种中最快方法3进行了测试和对比,事实证明,算法3是无敌,也是最简单。 大家不妨分析一下,本文方法7比方法3慢原因是什么?...(0) return data[-1] n = 8000000 for fibo in (fibo3, fibo7): start = time() r = str(fibo(n))

64540

Python快速计算Fibonacci数列n方法

1 return fibo1(n-1) + fibo1(n-2) @lru_cache(maxsize=64) def fibo2(n): '''递归法,使用缓存修饰器加速''' if n in...range(2, n+1): a, b = b, a+b return a # 测试3个函数执行速度 n = 40 for fibo in (fibo1, fibo2, fibo3...267914296:67.31945824623108 fibo2:267914296:0.0 fibo3:267914296:0.0 由于第一个函数运行速度非常慢,在n变大时只测试后面2个函数执行时间...380时,第二个函数由于递归深度过大而崩溃,抛出异常: RecursionError: maximum recursion depth exceeded while calling a Python object...下面继续测试3个函数,当n=500时,运行结果为: fibo3:139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125

1.4K70
  • Python要求O(n)复杂度求无序列表K大元素实例

    题目就是要求O(n)复杂度求无序列表K大元素 如果没有复杂度限制很简单。。。...加了O(n)复杂度确实有点蒙 虽然当时面试官说思路对了,但是还是没搞出来,最后面试官提示用快排思想 主要还是设立一个flag,列表中小于flag组成左列表,大于等于flag组成右列表,主要是不需要在对两侧列表在进行排序了...实际上如果每次刚好二分,第一取flag比较次数是n,第二n/2,依次下去是n/4,n/8…..n/2 就是n+n/2+n/4…. 最最丢人是计算这个结果还想了一会。。。...实际结果自然是n(1+1/2+1/4+1/8+….1/2ⁿ)=2n,复杂度自然就是O(n)了 最后实现代码如下: #给定一个无序列表,求出K大元素,要求复杂度O(n) def find_k(test_list...以上这篇Python要求O(n)复杂度求无序列表K大元素实例就是小编分享给大家全部内容了,希望能给大家一个参考。

    99110

    一个常见ms sql serverN条记录方法

    正文 好像也是一个不难问题,刚视频里看到,就记一下吧。 下面是表中原始数据结构,做了一个倒叙排序: select * from Employee order by Salary desc ?...Salary desc ) as result order by Salary asc 原理是先根据Salary降序排序获取到前3条记录,作为Result一个结果集 ?...下面再来看一下使用ROW_NUMBER(顺道试验了Rank,Dense_Rank这两个函数)这个函数写法: --获取salary排行第三的人信息 select * from ( select * ,...by salary desc) as DenseRankNumber from Employee ) as Result where Result.RowNumber =3 先看一下Result这个函数结果集...注意一下B和Csalary是一样,但是得到3个number值是不同,项目中看具体情况,选择需要函数。 我们这里取RowNumber. ? 结果也是一样。 就到这里吧。

    83620

    C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数。在主函数输入两个正整数m和n(m>=1,n>m),统计并输出m和n之间素数个数以及这些素数和。

    我是川川,有问题留言or加我扣扣私聊:2835809579 原题: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数。...在主函数输入两个正整数m和n(m>=1,n>m),统计并输出m和n之间素数个数以及这些素数和。...输入输出示例 输入:2 10 输出:count = 4 ,sum = 17 代码: 在这里插入代码片 ```c #include int isprime(int n) { int i=2;...for(i;i<n;i++) { if(n%i==0) break; } if(i==n) return 1;...else return 0; } int main() { int m,n,count=0; int sum=0; scanf("%d %d",&m,&n);

    2.6K20

    2022-04-21:给定一个包含 [0,n) 不重复整数黑名单 blacklist,写一个函数从 [0, n) 返回一个不在 blacklist 随机整数

    2022-04-21:给定一个包含 [0,n) 不重复整数黑名单 blacklist, 写一个函数从 [0, n) 返回一个不在 blacklist 随机整数, 对它进行优化使其尽量少调用系统方法...1 <= n <= 1000000000, 0 <= blacklist.length < min(100000, N)。 力扣710. 黑名单随机数。...范围是[0,n),黑马单有m个;那么随机数范围变成[0,n-m)。然后随机范围内数字,碰到黑名单数根据map映射。 代码用rust编写。...; } struct Solution { size: i32, convert: HashMap, } impl Solution { fn new(n:...n -= 1; while n > blacklist[i as usize] { if n == blacklist[(m - 1) as usize

    1.1K40

    函数递归与迭代附n阶乘+顺序打印一个整数每一位数+求n个斐波那契数

    下面是一个最简单C语言递归代码: #include int main() { printf("hehe\n"); main();//main函数⼜调⽤了main函数...函数不返回,函数对应栈帧空间就一直占用,所以如果函数调用存在递归调用的话,每一递归函数调用都会开辟属于自己栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...举例3:求n个斐波那契数 我们先来了解一下斐波那契数: 斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…… , 以递归方法定义:从第三开始,每一都等于前两之和...就像计算n个斐波那契数,是不适合使用递归求解,但是斐波那契数问题通过是使用递归形式描述,如下: 看到这公式,很容易诱导我们代码写成递归形式,如下所示: int Fib(int n) {...return 0; } 运行结果: 这里我们看到了,在计算40个斐波那契数时候,使用递归方式,3个斐波那契数就被重复计算了39088169,这些计算是非常冗余

    12010

    2022-10-30:给你一个长度为 n 整数数组 rolls 和一个整数 k 。 你扔一个 k 面的骰子 n ,骰子每个面分别是 1 到 k , 其中

    2022-10-30:给你一个长度为 n 整数数组 rolls 和一个整数 k 。...你扔一个 k 面的骰子 n ,骰子每个面分别是 1 到 k , 其中 i 扔得到数字是 rollsi 。 请你返回 无法 从 rolls 得到 最短 骰子子序列长度。...扔一个 k 面的骰子 len 得到一个长度为 len 骰子子序列 。 注意 ,子序列只需要保持在原数组顺序,不需要连续。...一遍历,一套一套收集。 力扣2350。力扣上测试了好几门语言。这次java运行速度最高,比rust都强了不少。c++表现不好,不见运行速度低,而且内存占用大。rust内存占用最小,go语言次之。...时间复杂度:O(n+k)。 空间复杂度:O(k)。 代码用rust编写。

    31510

    热爱函数你,句句纯正 Haskell【表达式篇】

    一个函数n 是入参;可以看到,Haskell 表达式并没有像在 JS 括号进行包裹; 当然,你也可以写像 JS 等号运算符; Prelude> isFive = (==5) Prelude...> :t abs4 abs4 :: (Ord p, Num p) => p -> p | 函数参数按特定条件分开; 在模式匹配,更精确更有指向性模式总是放在相对通用和宽泛模式前面(优先匹配)...(前缀、中缀、后缀、混合位置); 实际上,运算符共有 3 个属性: 优先级(在 Haskell ,有十个优先级(0 ~ 9)); 结合性(分为左结合、右结合、无结合); 位置(前、、后、混合)...:表示从一个列表取出 n 个元素(从 0 开始) Prelude> [1,2,3,4,5]!!...、$ 等; 这些都是为后面揭开 Haskell 函数式编程神秘面纱基础,期间也能一窥这种把函数当计算奇妙之处,即使不能在开发生产中用到 Haskell,对于平常编程思考也是大有裨益,希望你有受用到

    1.1K30

    2023-01-12:一个n*n二维数组,只有0和1两种值,当你决定在某个位置操作一,那么该位置行和列整体都会变成1,不

    2023-01-12:一个n*n二维数组,只有0和1两种值, 当你决定在某个位置操作一, 那么该位置行和列整体都会变成1,不管之前是什么状态。 返回让所有值全变成1,最少操作次数。...1 < n < 10,没错!原题就是说n < 10, 不会到10!最多到9! 来自华为。 答案2023-01-12: 四维dp+贪心。这道题优化力度很有限,跟暴力差不多。...i32) -> i32 { let mut n = n as u32; n = (n & 0x55555555) + ((n >> 1) & 0x55555555); n =...(n & 0x33333333) + ((n >> 2) & 0x33333333); n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f); n...= (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff); n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);

    2.7K10

    可爱 Python:Python 函数编程

    在 Python 1.x ,apply() 函数对于一个函数列表返回值直接应用于一个函数也很方便。Python 2.0 为这一目的提供了改进语法。...这些函数一个都接受函数对象作为其第一个自变量。  map() 对指定列表每个对应执行传递函数,并返回结果列表。...reduce() 对每个后续执行传递函数,返回是最终结果内部累加;例如 reduce(lambda n,m:n*m, range(1,10)) 意味着“10 阶乘”(换句话说,用每一乘上前一相乘乘积...filter() 使用传递函数列表每一“求值”,然后返回经过甄别的,通过了传递函数测试列表。  我们还经常将函数对象传递给自己定制函数,但它们通常等同于上述内置函数组合。 ...+t, map(lambda l,n=n: [l]*n, lst)) print bigmuls((1,2,3,4),(10,15,3,22)) 在示例,我们匿名 (lambda) 函数对象与名称进行绑定

    91120
    领券